Я создал небольшой прямоугольник на холсте, который находится в JFrame. Я сделал класс синглтоном (я знаю, что некоторые из вас скажут, что это плохая практика, но меня это устраивает). В настоящее время я просто использую метод repaint() всякий раз, когда нажимается клавиша со стрелкой. Однако сейчас я рассматриваю возможность создания игрового цикла с таймером свинга.

Я создал класс под названием «GameLoop.java» и добавил следующий код.

public class GameLoop implements ActionListener {


    Timer timer = new Timer(10, this);

    public void actionPerformed(ActionEvent e) {

        timer.start();
        GameCanvas.getInstance().repaint();

    }
}

Это, однако, ничего не делает с экраном при нажатии стрелки. Есть ли что-то, что я упускаю/делаю неправильно?

0
InexperiencedCoder 9 Апр 2020 в 02:43
Нам нужно увидеть, что на самом деле обновлено, чтобы сказать, что вы хотите, чтобы это было неправильно. Как GameCanvas меняет то, что рисуется?
 – 
markspace
9 Апр 2020 в 02:45
Swing также не лучший выбор для программирования игрового типа, но кажется возможным, если вы проделаете дополнительную работу. Вот кровавые подробности: pavelfatin.com/low-latency-painting- в движении
 – 
markspace
9 Апр 2020 в 02:49
Вы также можете выполнить поиск «конвейер java Swing» другими словами и получить полезную информацию: docs.oracle.com/javase/10/troubleshoot/…
 – 
markspace
9 Апр 2020 в 02:51
По сути, ваша проблема в том, что Timer не запускается автоматически... и вам не следует вызывать start в методе actionPerformed. Вместо этого вызовите start как часть фазы инициализации/настройки. «Игровой цикл» также должен принимать любые входные состояния и изменять игровое состояние до того, как оно будет отрисовано.
 – 
MadProgrammer
9 Апр 2020 в 02:51

1 ответ

actionPerformed(ActionEvent e) вызывается только после запуска таймера, поэтому его нельзя использовать для запуска таймера.
Вам нужно начать его в другом месте. Например:

public class GameLoop implements ActionListener {

    GameLoop() {
        Timer timer = new Timer(10, this);
        timer.start();
    }

    public void actionPerformed(ActionEvent e) {
        GameCanvas.getInstance().repaint();
    }
}
1
c0der 9 Апр 2020 в 19:18