2015-09-14 38 views
0

我们想为我们的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的地方,但我们不知道它到底是什么。

+0

请在这里看看:http://stackoverflow.com/questions/2793002/jpanel-not-listening-to-key-event-when-there-is-a-child-component-with-jbutton-o –

+0

@ D-Klotz谢谢,我会试试看,并让你知道如果解决方案适合我。 – Octoshape

+0

@ D-Klotz可悲的是,使用输入映射并不能解决我的问题,仍然在触发'startGameButton'后,游戏'JPanel'的'KeyListener'没有触发它的事件。 – Octoshape

回答

0

感谢D-Klotz对输入映射问题的评论。尽管这不是我的问题的正确解决方案,但它引起了我的注意:

从JFrame切换到另一个窗口然后返回时,KeyListener再次正常工作。因此代码在actionPerformed方法唯一缺少的路线是:

game.requestFocus(); 

就像一个魅力。再次感谢您的帮助。

+0

很高兴你能工作。 –