Java:游戏中未检测到KeyListener

时间:2015-10-29 20:40:15

标签: java keylistener

对于我的作业,我必须为游戏中的角色添加动作。它的工作方式很简单:如果他们向左按,他们将方向改为左,如果他们按向右,他们会改变到右边(角色总是在移动)。

这种方式的工作方式是每半秒左右游戏调用一个update()方法重新绘制等等。然后通过调用updateMoveDirection()询问角色是否想要向新的方向移动在角色上。

我已经测试过了,这种方法肯定会按预期定期调用。但是,当我添加KeyListener以查找左右点击时,则不会检测到这些。我认为这与班级的重点有关?但是,由于这个类没有图形元素,所以我不确定它如何请求焦点?

public void updateMoveDirection() {
    KeyListener k = new KeyListener() {
        public void keyPressed(KeyEvent arg0) {
            System.out.println("KEY");
            if(arg0.equals(KeyEvent.VK_LEFT)){
                System.out.println("LEFT");

            }
            if(arg0.equals(KeyEvent.VK_RIGHT)){
                System.out.println("RIGHT");

            }

        }

        public void keyReleased(KeyEvent arg0) {
            // TODO Auto-generated method stub

        }

        public void keyTyped(KeyEvent arg0) {
            // TODO Auto-generated method stub

        }
    };
}

1 个答案:

答案 0 :(得分:1)

我不确定你的游戏是如何设置的。通常只需要将一个KeyListener连接到JFrame,JWindow,JComponent或Canvas(或者更常见的是用于绘制的Swing类)。上面的代码看起来就像你试图为你想要的每个游戏对象添加一个KeyListener对输入作出反应。技术上可行,但不是besr方法。

但更有可能你的问题是另一个问题。请注意,由于某种原因,Java会同时检测到多个按键会有麻烦。此外,只要按下按键,就会经常调用按键。

我建议:

  1. 创建一个实现Keylistener接口的类,并且可以访问该角色以及您想要控制的所有其他内容。我们调用那个类InputController。
  2. 将InputController作为侦听器添加到swing组件。
  3. 在InputController中使用keyReleased和keyTyped而不是keyPressed
  4. 为每个键添加一个布尔成员(例如boolean isLeftDown)以及匹配的setter方法
  5. 在InputController中,您现在可以使用字符的setter来表示值,并在update方法中检查它们是否已关闭
  6. 编辑: 或者,您可以将布尔值放在InputController中,并为角色提供访问权限。然后它更符合“更新读取输入”