Estoy intentando hacer un simple juego 2D en Java.La mejor forma de implementar un bucle de juego sin congelar el hilo de la interfaz de usuario
Hasta ahora tengo un JFrame
, con una barra de menú, y una clase que se extiende JPanel
y anula el método paint
. Ahora necesito un ciclo de juego, donde actualizaré la posición de las imágenes, etc. Sin embargo, estoy estancado en la mejor manera de lograr esto. ¿Debería usar multi-threading, porque seguramente, si pones un ciclo infinito en el hilo principal, la IU (y por lo tanto mi barra de menú) se congelará?
Aquí está mi código hasta ahora:
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);
}
}
Cualquier indicador o consejos? ¿Dónde debería poner mi lazo? En mi clase principal, o mi clase GameCanvas?