2013-12-19 91 views
1

我需要設計一個雙人遊戲。每個球都有球,應該能夠將球移動到右或左,第一個球員有'a''d'按鈕,第二個球員有右,左箭頭按鈕。然而,目前一名球員需要等待另一名球員的動作完成才能移動自己的球。我如何解決這個問題?這裏是我的代碼的相關部分:我怎樣才能讓多個鍵綁定同時工作?

public class AnimationWindow extends JPanel{ 

     public AnimationWindow() 
     { 

      super(); 
      .... 
      .... 
      cezmiMover(); 

     } 



public void cezmiMover(){ 

     this.getInputMap().put(KeyStroke.getKeyStroke('a'), "left1"); 
     this.getActionMap().put("left1", new AbstractAction() { 

      public void actionPerformed(ActionEvent e) { 

       board.cezmi1.moveLeft(); 
      } 
     }); 

     this.getInputMap().put(KeyStroke.getKeyStroke('d'), "right1"); 
     this.getActionMap().put("right1", new AbstractAction() { 

      public void actionPerformed(ActionEvent e) { 

       board.cezmi1.moveRight(); 
      } 
     }); 

     this.getInputMap().put(KeyStroke.getKeyStroke("LEFT"), "left2"); 
     this.getActionMap().put("left2", new AbstractAction() { 

      public void actionPerformed(ActionEvent e) { 

       board.cezmi2.moveLeft(); 
      } 
     }); 

     this.getInputMap().put(KeyStroke.getKeyStroke("RIGHT"), "right2"); 
     this.getActionMap().put("right2", new AbstractAction() { 

      public void actionPerformed(ActionEvent e) { 

       board.cezmi2.moveRight(); 
      } 
     }); 
    } 
} 

回答

7

您需要使用一系列標誌和某種「更新」循環更新的遊戲取決於標誌的狀態的狀態...

例如,通過創建一系列標誌的開始......

private boolean p1Left, p1Right, p2Left, p2Right = false; 

這些可以很容易地通過個別球員的對象保持不變,但你沒有提供太多的代碼...

接下來,你需要監視按鍵和鍵釋放事件,並根據需要設置相應標誌的狀態...

this.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "right1down"); 
this.getActionMap().put("right1down", new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     p1Right = true; 
    } 
}); 

this.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "right1up"); 
this.getActionMap().put("right1up", new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     p1Right = false; 
    } 
}); 

然後,你需要某種循環或定時器,可以更新遊戲的狀態。就個人而言,我喜歡使用javax.swing.Timer,但那只是我。

上的更新循環的每個運行,您需要檢查每個標誌的狀態,並相應地更新對象...

if (p1Right) { 
    board.cezmi1.moveRight(); 
} 

對於example

3

退房Motion Using the KeyboardKeyboardAnimation.java代碼包含一個完整的工作示例,演示了執行此操作的一種方法。

的KeyboardAnimation類的每個實例:

  1. 動畫使用定時器
  2. 動畫由分配將KeyStroke控制
  3. 一個地圖跟蹤已​​壓到它擊鍵的成分(JLabel的)同時處理多個KeyStrokes
相關問題