2012-04-30 40 views
1

我想创建一个坦克游戏,但我仍然在学习如何在Java中进行图形编程。我最初尝试用KeyListeners移动两个图像中的一个(哪一个取决于哪个玩家要去哪个)。有人告诉我,Key绑定可能是更有效的方法。下面是我的一些代码:使用键绑定来移动图像

public class FrameMain extends JFrame{ 
    ... 
     public FrameMain(){ 

      this.addBindings(); 

的addBindings()方法:

protected void addBindings() { 
     InputMap inputMap = pnlPlay.getInputMap();  

     KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Event.KEY_PRESS); 
     inputMap.put(key, pnlPlay.pnlGame.MoveTank(2, pnlPlay.nPlayer)); 

     key = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Event.KEY_PRESS); 
     inputMap.put(key, pnlPlay.pnlGame.MoveTank(-2, pnlPlay.nPlayer)); 
} 

的MoveTank方法:

public int MoveTank(int xChange, int nPlayer){ 

     System.out.println("move "+nPlayer); 

     if(nPlayer==0){ 
      tank1.x+=xChange; 
     }else tank2.x+=xChange; 

     repaint(); 
     return 1; 
} 

我遇到的问题是,当我按无论是右键还是左键,我都没有得到任何回应。它应该打印“移动#”,但它不是。如果有人知道我做错了什么,或者可以指向我做一些代码的方向,我会很感激。我从看到代码的工作顺序中学到最好,然后玩弄它。

+2

方法在Java中应该以小写字母开头。 – BVSmallman

+0

你可以看看我发布在这里的例子:[Swing Timer and Key Bindings](http://stackoverflow.com/a/6887354/522444)。 –

+0

非常感谢!该代码正是我所期待的。 – user1366342

回答

2

两件事情,此代码:

  • 我没有看到有关动作映射任何东西。输入映射将键映射到动作标识符,动作映射表是标识符与实际动作之间的链接。所以,你通常有这样的代码

    InputMap inputMap = component.getInputMap(); 
    ActionMap actionMap = component.getActionMap(); 
    Action actionToTrigger = ...; 
    actionMap.put("myAction", actionToTrigger); 
    inputMap.put(key, "myAction"); 
    
  • 如果把你的动作在动作有图有正确的标识符,它仍然无法正常工作,你可能已经使用了错误的输入地图。有3个不同的输入映射,如Swing键绑定指南中所述。与其他

尝试也许你应该,因为它解释这一切更详细地再次谘询Swing keybindings tutorial +中包含的代码示例