Java从关键监听器获取同时输入

标签 java keylistener keyevent

我正在创建一个简单的游戏,其中按键事件将 JLabelJPanel 中移动一定数量的像素。

它的工作没有任何错误,当我点击右箭头时,它会向右移动,依此类推。然而,一旦我按下第二个键,它就会中断原来的运动。

例如,如果我按住向左键(并且对象向左移动),然后我点击向上箭头,则对象停止向左移动。 (当然)这是因为我对所有 key 仅使用一个 key 事件。

这显然不是一个可接受的情况,因为一旦我添加第二个对象(对于另一个玩家),每个玩家都会不断地阻止其他玩家的移动。

所以我的问题是:如何最好地合并多个同时关键操作? (最好不要编写数十个 KeyAdapterKeyEvent)

信息:目前我有第二个类,它扩展了KeyAdapter。第二个类包含一个 KeyPressed 函数,然后使用 .getKeyCode(); 找出按下了哪个键并执行操作。

编辑:欢迎任何建议!

最佳答案

解决办法其实很简单。当注册按键事件时,存储记录移动的变量。当注册按键释放事件时,取消存储该变量。

这意味着在您释放按键之前,移动将继续被记录。该解决方案还需要一个计时器,以便重复循环并检查您的事件是否正在运行。您可以使用延迟,但对于此类任务,单独的线程是最有效的。

首先,您需要一个可以存储您的操作的全局变量:

String action = "";

然后你需要一个关键的监听器来记录你的输入,当你停止输入时:

// create key listener
addKeyListener(new KeyListener()
    {
          @Override 
          public void keyPressed(KeyEvent e)
          {         
              int keyCode = e.getKeyCode();
              String event = KeyEvent.getKeyText(keyCode);


              if (event.equals("A")) {
                  // DO YOUR EVENT IF THE KEY HAS BEEN PRESSED
                  action = "A";
              }
          }

        @Override
        public void keyTyped(KeyEvent e) {}

        @Override
        public void keyReleased(KeyEvent e) {
              int keyCode = e.getKeyCode();
              String event = KeyEvent.getKeyText(keyCode);


              if (event.equals("A")) {
                  // STOP DOING YOUR EVENT
                  action = "";
              }

         }

    });

最后,您将需要一个计时器线程来循环并执行您的操作:

    // CREATE A TIMER THREAD
       Timer timer = new Timer();
       timer.schedule(new TimerTask() {

           // this is what happens every time the timer runs
           @Override
           public void run() { 
             // check if your action should be preformed
             if (action.equals("A")) {
                 // ... do something
             }

           }

       }, 0, 1000);   // 1000 MILLESECONDS = 1 SECOND

       // note: you will need to run 'timer.cancel();' at some point to end your timer

此外,这些其他主题也值得一看,包括关于 keylistener is games 的主题。和about timer tasks .

关于Java从关键监听器获取同时输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43796926/

相关文章:

java - Android 中图像的自定义键盘实现

Java KeyListener 不起作用,我认为它与 addKeyListener() 有关;方法我不知道为什么

java - 如何使用 KeyListener 接口(interface)?

java - js判断iframe是否包含图片

java - 在 JAR 中构建 Maven 多模块项目

java - 在另一个类中定义并在 JFrame 中使用的 JButtton 监听器

java - KeyListener 和 jframe 的问题

Java 2D 游戏 - KeyListener/KeyEvent 类 - 空闲动画问题

java - 文本域监听器

android - 按两次电源按钮发送短信