2015-09-14 67 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

很高興你能工作。 –