Hallo,
ich schreibe momentan ein 2D-Spiel in Java und habe eben alle Components aus AWT mit JComponents aus Swing ersetzt.
Ich nutze einen JFrame und füge diesem ein JPanel hinzu, auf dem alle JButtons usw. liegen und der auf die Listener hören sollte. Einen Mouse- und einen KeyListener.
Ich habe einfach alles so wie in der vorigen funktionierenden Version gelassen, nur die Listener einfach dem JPanel und nicht dem JFrame zugewiesen. Es funktioniert jedoch nur noch der MouseListener, der KeyListener erhält keine Eingaben.
Ich habe schon herausgefunden, dass Swing nicht threadsicher ist.
Beim Start des Spiels rufe ich normal die Methode createFrame() auf und lade den Rest des Spiels, dann starte ich zwei eigene Threads: Der eine ruft immer die draw()-Methode auf und der andere berechnet die neuen Positionen aller Figuren. Kann das damit zusammenhängen?
JFrame wird erstellt:
Der KeyListener:
Die alte createFrame()-Methode mit Components aus AWT:
ich schreibe momentan ein 2D-Spiel in Java und habe eben alle Components aus AWT mit JComponents aus Swing ersetzt.
Ich nutze einen JFrame und füge diesem ein JPanel hinzu, auf dem alle JButtons usw. liegen und der auf die Listener hören sollte. Einen Mouse- und einen KeyListener.
Ich habe einfach alles so wie in der vorigen funktionierenden Version gelassen, nur die Listener einfach dem JPanel und nicht dem JFrame zugewiesen. Es funktioniert jedoch nur noch der MouseListener, der KeyListener erhält keine Eingaben.
Ich habe schon herausgefunden, dass Swing nicht threadsicher ist.
Beim Start des Spiels rufe ich normal die Methode createFrame() auf und lade den Rest des Spiels, dann starte ich zwei eigene Threads: Der eine ruft immer die draw()-Methode auf und der andere berechnet die neuen Positionen aller Figuren. Kann das damit zusammenhängen?
JFrame wird erstellt:
Java:
public void createFrame() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
maximizeFrame(getFirstCompatibleMode(displayModes));
frame.setResizable(false);
frame.setIgnoreRepaint(true);
frame.setVisible(true);
((JComponent) frame.getContentPane()).setOpaque(false);
JPanel panel = new JPanel();
main.getComponentHandler().initComponents(panel);
panel.setOpaque(false);
panel.addKeyListener(main.getKeyHandler());
panel.addMouseListener(main.getMouseListener());
frame.getContentPane().add(panel);
frame.createBufferStrategy(2);
}
Der KeyListener:
Java:
public class KeyHandler implements KeyListener {
private final Main main;
public KeyHandler(Main main) {
this.main = main;
}
@Override
public void keyPressed(KeyEvent event) {
System.out.println(event.getKeyCode());
switch(event.getKeyCode()) {
case KeyEvent.VK_ESCAPE : if(main.getStatus() == GameStatus.GAME || main.getStatus() == GameStatus.LEVELCHANGE) main.setStatus(GameStatus.MENU_GAME);
else if(main.getStatus() == GameStatus.MENU_GAME || main.getStatus() == GameStatus.DEV_MAIN) main.setStatus(GameStatus.GAME); break;
case KeyEvent.VK_RIGHT : main.getGameManager().getPlayers().get(0).changeDirection(Player.Direction.RIGHT); break;
case KeyEvent.VK_LEFT : main.getGameManager().getPlayers().get(0).changeDirection(Player.Direction.LEFT); break;
case KeyEvent.VK_ENTER : main.setStatus(GameStatus.GAME); break;
case KeyEvent.VK_SPACE : main.getGameManager().getPlayers().get(0).shootArrow(); break;
}
event.consume();
}
@Override
public void keyReleased(KeyEvent event) {
int keyCode = event.getKeyCode();
switch(keyCode) {
case KeyEvent.VK_RIGHT : main.getGameManager().getPlayers().get(0).setDirection(Player.Direction.CENTER); break;
case KeyEvent.VK_LEFT : main.getGameManager().getPlayers().get(0).setDirection(Player.Direction.CENTER); break;
}
}
@Override
public void keyTyped(KeyEvent event) {}
}
Die alte createFrame()-Methode mit Components aus AWT:
Java:
public void createFrame() {
frame = new JFrame("Bubble Trouble", graphicsDevice.getDefaultConfiguration());
frame.setUndecorated(true);
frame.setIgnoreRepaint(true);
frame.setResizable(true);
frame.setFocusable(true);
maximizeFrame(getFirstCompatibleMode(displayModes));
main.getComponentHandler().initComponents(frame);
frame.addKeyListener(main.getKeyHandler());
frame.addMouseListener(main.getMouseListener());
frame.setVisible(true);
//Enable double-buffering
frame.createBufferStrategy(2);
}
Zuletzt bearbeitet: