Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:游戏中未检测到KeyListener_Java_Keylistener - Fatal编程技术网

Java:游戏中未检测到KeyListener

Java:游戏中未检测到KeyListener,java,keylistener,Java,Keylistener,对于我的任务,我必须在游戏中为角色添加移动。其工作方式很简单:如果他们按左键,他们会将方向更改为左;如果他们按右键,他们会将方向更改为右(角色总是在移动) 其工作方式是每隔半秒左右,游戏会调用一个update()方法,在该方法中重新绘制等。然后,游戏会通过调用角色上的updateMoveDirection()来询问角色是否要向新的方向移动 我已经测试过了,这个方法肯定会像预期的那样被定期调用。但是,当我添加一个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

        }
    };
}

我不确定你的游戏是如何设置的。通常,将一个KeyListener附加到JFrame、JWindow、JComponent或Canvas(或者更一般地说是用于绘制的Swing类)就足够了。上面的代码看起来像是您将尝试为每个要对输入作出反应的游戏对象添加一个KeyListener。技术上可能,但不是besr方法

但是,您的问题更可能是另一个问题。请注意,由于某些原因,Java在一次检测多个按下的键时可能会遇到问题。此外,只要按下键,就会经常调用keypressed

我建议:

  • 创建一个实现Keylistener接口的类,该类可以访问角色和您想要控制的所有其他内容。让我们调用该类InputController
  • 将InputController作为侦听器添加到swing组件
  • 在InputController中,使用keyReleased和keyTyped代替按键
  • 为每个键添加一个布尔成员(例如布尔isLeftDown)和匹配的setter方法
  • 在InputController中,您现在可以使用字符设置器设置值,并在update方法中检查值是否关闭
  • 编辑:
    或者,您可以将布尔值放在InputController中,并赋予字符对其的访问权限。然后,它更准确地符合“更新读取输入”的要求

    您在哪里调用
    addKeyListener()
    ?@NathanielJones我在哪里可以调用它,因为我没有将它添加到GUI组件(如框架等)?感谢@monty的输入,但在项目描述中,它说updateMovement方法:“读取键盘输入,并根据需要更改蛇的方向。”。在我看来,它应该在这个方法中处理,而不是在一个外部类中处理?此外,游戏的Swing组件在一个单独的jar文件中在外部处理,因此我不能直接更改它们。@monty使用一个类而不是将它放在方法中是正确的。此外,即使你不编辑Swing组件s直接访问它们,然后从类中调用,例如,
    myWindow.addKeyListener();
    。@NathanielJones刚刚注意到你可以这样做。感谢大家的帮助!@monty ah刚刚注意到你可以从外部库中添加它!感谢帮助!Awarded@John如果你(不得不)使用外部库在原始问题中提到这一点是明智的。它们很可能已经涵盖了输入处理,并且可能提供了其他读取输入的方法(这可能是您的老师希望看到的方式)。这个答案是为Java游戏从头开始的场景量身定制的。