Установка собственного разрешения в JavaFX - PullRequest
0 голосов
/ 26 мая 2018

Я бы хотел установить собственное разрешение в игре, над которой я работаю: я знаю, что это можно сделать в 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);
    });
    }
}
...