我們想爲我們的2D遊戲添加一個菜單。Java Swing 2D遊戲 - 在CardLayout開關後EventQueue停止發射
到目前爲止,我們在主線程上運行了遊戲循環,而來自Swing的EventQueue
正在處理我們遊戲的關鍵輸入。現在既然我們想添加菜單,我們不再可以簡單地從我們的主要方法啓動gameloop。
問題:我們不知道如何以EventQueue
繼續接收KeyEvent
的方式啓動gameloop。
下面是我們在我們的菜單:
startGameButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout)Menu.this.getParent().getLayout();
cl.show(Menu.this.getParent(), "Game");
}
});
所以點擊startGameButton
刪除從JFrame
菜單,顯示遊戲本身,而是遊戲中被凍結,因爲我們不開始從gameloop我們的主線了。我們認爲它就在這裏,我們需要開始gameloop。
所以我們創建了一個新Thread
將運行我們的gameloop凍結防止我們的UI:
startGameButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout)Menu.this.getParent().getLayout();
cl.show(Menu.this.getParent(), "Game");
Thread gameThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
game.update();
game.repaint();
Thread.sleep(10);
}
}
});
gameThread.start();
}
});
這完美的作品,遊戲中顯示出來,並且它的運行...但是:我們KeyEvent
s爲無更長的射擊。不知怎的,EventQueue
不再撿起按鍵,我們不知道爲什麼。
在主方法中使用完全相同的代碼(創建Thread
並啓動它)而不使用CardLayout
菜單完美地工作,也得到KeyEvent
s。所以我們認爲這個問題存在於使用CardLayout
的地方,但我們不知道它到底是什麼。
請在這裏看看:http://stackoverflow.com/questions/2793002/jpanel-not-listening-to-key-event-when-there-is-a-child-component-with-jbutton-o –
@ D-Klotz謝謝,我會試試看,並讓你知道如果解決方案適合我。 – Octoshape
@ D-Klotz可悲的是,使用輸入映射並不能解決我的問題,仍然在觸發'startGameButton'後,遊戲'JPanel'的'KeyListener'沒有觸發它的事件。 – Octoshape