我们想为我们的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