Я бы хотел установить собственное разрешение в игре, над которой я работаю: я знаю, что это можно сделать в AWT.Но не могу найти никакой документации о способе достижения этого с помощью Glass Windowing Toolkit.Я бы предпочел вообще не заходить в AWT, если кто-нибудь знает лучший способ, так как мне интересно, насколько эффективным может быть это решение.
Я также знаю о JFXPanels и провел некоторое время, экспериментируя с ними.Моя игра может масштабироваться, чтобы приспособиться к разным размерам экрана и аспектам, но если игрок хочет уменьшить количество пикселей, визуализируемых графическим процессором, я хочу предложить ему эту опцию, уменьшив разрешение экрана.Вместо того, чтобы игроку приходилось делать это в ОС перед запуском игры.Это довольно стандартно в большинстве игр.
Мои эксперименты с JFXPanels работают нормально, но, похоже, я получаю доступ только к сцене JavaFX, а не к сцене: моя игра часто использует этапы для модальных диалогов.В этом примере объект сцены JavaFX встроен в JFrame.Мой вопрос заключается в следующем: как я могу получить способ добавлять различные модалы и т. Д. В мою игру?
Я хочу работать в JavaFX, а не в Swing, и предпочел бы избегать использования Swing во время кодирования, так как он медленно запускаетсяAWT полноэкранный.Я также хочу избегать использования менеджеров компоновки Swing для работы с моими модальными окнами (что звучит ужасно).
Я нерешительно публикую этот «хак», чтобы запустить JavaFX с измененным размером экрана AWT с измененным разрешением экрана, в надежде, что кто-нибудьесть лучший способ сделать это.(«Заглушка» - это скрытие всех белых экранов и мерцаний при изменении разрешения экрана.)
import javafx.application.Application;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//alt-F4 to exit once in full screen mode
public class DisplaysFX extends Application {
private final static boolean RUN_AS_AWT = true;
private JFrame blankingFrame;
private JFrame jFrame;
private JFXPanel fxPanel;
public static void main(String[] args) {
if (RUN_AS_AWT) {
new DisplaysFX().runTest();
} else {
Application.launch(DisplaysFX.class, args);
}
}
@Override
public void start(Stage primaryStage) {
Scene s = startFXScene();
primaryStage.setScene(s);
primaryStage.show();
}
private void initAndShowGUI() {
fxPanel = new JFXPanel();
jFrame.add(fxPanel);
Platform.runLater(() -> initFX(fxPanel));
}
private void initFX(JFXPanel fxPanel) {
Scene scene = startFXScene();
fxPanel.setScene(scene);
fxPanel.setVisible(true);
}
private Scene startFXScene() {
Group root = new Group();
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
javafx.scene.shape.Rectangle r = new javafx.scene.shape.Rectangle(0, 0, dimension.width, dimension.height);
r.setFill(javafx.scene.paint.Color.PURPLE);
root.getChildren().add(r);
Scene scene = new Scene(root);
Text text = new Text();
text.setFont(new Font(100));
text.setText("I'm some text in JavaFX");
text.setX(((dimension.width / 2) - text.getLayoutBounds().getWidth() / 2));
text.setY(((dimension.height / 2) - text.getLayoutBounds().getHeight() / 2));
root.getChildren().add(text);
return (scene);
}
private void runTest() {
new Thread(() -> createBlankJFrame()).start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] devices = g.getScreenDevices();
SwingUtilities.invokeLater(() -> {
jFrame = new JFrame();
jFrame.setVisible(false);
jFrame.getContentPane().setBackground(Color.BLACK);
jFrame.setUndecorated(true);
jFrame.setResizable(false);
jFrame.setExtendedState(Frame.MAXIMIZED_BOTH);
jFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event) {
SwingUtilities.invokeLater(() -> {
Window w = devices[0].getFullScreenWindow();
if (w != null) {
w.dispose();
}
devices[0].setFullScreenWindow(null);
jFrame.dispose();
blankingFrame.dispose();
System.exit(0);
});
}
});
devices[0].setFullScreenWindow(jFrame);
DisplayMode displayMode = new DisplayMode(1920, 1080, 32, 60); //change this if want to alter your screen to a different size
devices[0].setDisplayMode(displayMode);
});
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> SwingUtilities.invokeLater(() -> initAndShowGUI())).start();
}
private void createBlankJFrame() {
SwingUtilities.invokeLater(() -> {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
blankingFrame = new JFrame();
blankingFrame.getContentPane().setBackground(Color.BLACK);
blankingFrame.setMinimumSize(screenSize);
blankingFrame.setUndecorated(true);
blankingFrame.setResizable(false);
blankingFrame.setVisible(true);
});
}
}