Java从密钥监听器获取同时输入

时间:2017-05-05 05:08:56

标签: java keylistener keyevent

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

它没有任何错误,当我点击右箭头时它向右移动,依此类推。但是,只要按下第二个键,它就会中断原始动作。

例如,如果我按住左键(并且对象向左移动)然后我点击向上箭头,则对象停止向左移动。这是(当然)因为我只使用了一个关键事件来处理我的所有密钥。

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

所以我的问题是:我如何才能最好地合并多个同时关键的动作? (最好不要写几十个KeyAdapterKeyEvent

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

编辑:欢迎任何建议!

1 个答案:

答案 0 :(得分:0)

解决方案实际上非常简单。注册按键事件时,请存储一个记录运动​​的变量。注册键释放事件后,请取消存储该变量。

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

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

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