Java Swing - GameL oop - странные результаты - PullRequest
0 голосов
/ 31 марта 2020

Я студент-компьютерщик, пытаюсь освоить основы разработки игр. Я работал с GUI фреймворками, такими как. NET Winforms и т. Д. c раньше, так что я не совсем новичок в GUI разработке, но сейчас я пытаюсь войти в Game Dev, и, как я Поймите, огромной центральной частью игрового устройства является Game L oop.

Как я понимаю, Game l oop работает примерно так: (псевдокод)

while (gameNotOver):
    modelData = getModelData;
    render(modelData);

И в идеале этот l oop будет выполняться и повторяться снова и снова так быстро, как мог бы каждый кадр (FPS).

Теперь я пытаюсь сделать это в Java Swing ДО Я продвигаюсь в Unity или что-то еще, поэтому у меня есть некоторые основы. Вот мой код:

Класс приложения:

public static void Start(){
    GameLoop();
}

private static void GameLoop(){
    System.out.println("GameLoop()");
    System.out.println("---------------------------");
    JFrame frame = new JFrame();
    frame.setSize(300, 400);
    GUI gui = new GUI();
    frame.add(gui);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    int count = 0;
    while (count < 10){
        System.out.println("T-" + count + "-iteration");
        int modelInfo = Engine.update();
        gui.repaint();
        count++;
        System.out.println("---------------------------");
    }
}

GUI класс:

public class GUI extends JPanel{

    public GUI(){

    }

    @Override
    public void paint(Graphics g){
        System.out.println("GUI-paint()");
    }
    }

Основной метод находится в своем собственном классе, где он имеет одну строку: Application.Start();

Не то, чтобы код не работал, но меня это беспокоит:

Вывод результаты на консоли

Как видите, paint() вызывается только в самом конце, в то время как все остальное в порядке в игре oop.

Сейчас Я действительно знаю, что paint() вызывается один раз при создании JPanel, но во-первых, не означает ли это, что оператор print в генерирует будет наверху?

Почему игра l oop ПЕРВАЯ завершает 10 итераций, прежде чем вызвать paint()?

В идеале я пытаюсь каждый раз вызывать перерисовку В игре l oop каждый раз ( Часть рендера игры l oop)

Любая помощь очень ценится

Спасибо !!

1 Ответ

0 голосов
/ 31 марта 2020

Псевдоигра l oop выглядит примерно так:

while (game not over)
    update model
    render graphics
    sleep

Этот l oop не может происходить в том же коде, который конструирует и выполняет компоненты Swing. Поток, который создает и выполняет компоненты Swing, называется Поток диспетчеризации событий .

Псевдоигра l oop должна происходить в отдельном потоке или таймере свинга. Когда я говорю «рендеринг графики», я имею в виду рисование на панели рисования (JPanel) с использованием информации, хранящейся в игровой модели.

При создании панели рисования вы переопределяете метод paintComponent класса JPanel. Первым утверждением вашего метода должен быть вызов super.paintComponent для поддержки цепочки рисования Swing.

Ответы на этот вопрос переполнения стека: " Как вы можете организовать код для игры, чтобы она соответствовала шаблон MVC?", должен быть вам полезен.

...