Лучший способ реализовать игровой цикл без замораживания потока пользовательского интерфейса
Я пытаюсь сделать простую 2D-игру на Java.
Пока у меня естьJFrame
, с menubar, и класс, который расширяетсяJPanel
и переопределяет этоpaint
метод. Теперь мне нужно запустить игровой цикл, где я буду обновлять положение изображений и так далее. Тем не менее, я застрял на том, как лучше всего добиться этого. Должен ли я использовать многопоточность, потому что, конечно, если вы поместите бесконечный цикл в основной поток, пользовательский интерфейс (и, следовательно, моя строка меню) зависнет?
Вот мой код до сих пор:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class GameCanvas extends JPanel {
public void paint(Graphics g) {
while (true) {
g.setColor(Color.DARK_GRAY);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
@SuppressWarnings("serial")
public class Main extends JFrame {
GameCanvas canvas = new GameCanvas();
final int FRAME_HEIGHT = 400;
final int FRAME_WIDTH = 400;
public static void main(String args[]) {
new Main();
}
public Main() {
super("Game");
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem startMenuItem = new JMenuItem("Pause");
menuBar.add(fileMenu);
fileMenu.add(startMenuItem);
super.add(canvas);
super.setVisible(true);
super.setSize(FRAME_WIDTH, FRAME_WIDTH);
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setJMenuBar(menuBar);
}
}
Любые указатели или советы? Где я должен поставить свою петлю? В моем основном классе или в классе GameCanvas?