【问题标题】:Java multiple keypressesJava 多次按键
【发布时间】:2014-09-05 00:38:14
【问题描述】:

有没有一种简单的方法可以同时检查多个按键?我走路时使用:

    this.addKeyListener(new KeyAdapter() 
    {
        public void keyPressed(KeyEvent arg0)
        {
            if(arg0.getKeyCode()==KeyEvent.VK_LEFT)
            {
                if (checkMovement(-1, user.getFalling()))
                {
                    user.move("left");
                }
            }
        }
    });

并且希望能够在移动时按住按钮“冲刺”。我尝试使用另一个 KeyListener 检查另一个键,然后使用方法“user.sprint()”,但它不能同时识别两个按键。

是否有任何简单的方法来检查一个键是否已关闭?我确实有多个线程在运行,我可以在线程中放置某种 if 语句来检查线程循环时是否按下它?

谢谢!

【问题讨论】:

    标签: java key awt keypress keylistener


    【解决方案1】:

    我找到了一个我非常喜欢的解决方案。万一其他人想看看我是怎么做到的,我将在下面发布代码:)

    this.addKeyListener(new KeyAdapter() 
        {
            public void keyPressed(KeyEvent arg0)
            {
                if(arg0.getKeyCode()==KeyEvent.VK_LEFT)
                {
                    if (!world.user.moving()) if (world.checkMovement(-1)) world.user.move("left");
                }
                if(arg0.getKeyCode()==KeyEvent.VK_RIGHT)
                {
                    if (!world.user.moving()) if (world.checkMovement(1)) world.user.move("right");
                }                   
                if (arg0.getKeyCode()==KeyEvent.VK_UP)
                {
                    world.user.jump();
                }   
            }
    
            public void keyReleased(KeyEvent arg0)
            {
                if(arg0.getKeyCode()==KeyEvent.VK_LEFT)
                {
                    world.user.move("left","stop");
                }                                   
                if (arg0.getKeyCode()==KeyEvent.VK_RIGHT)
                {
                    world.user.move("right","stop");
                }
            }
        });
    

    基本上,按键只是设置玩家的移动方向。为了停止播放器,它会检查你是否在你要去的方向上松开了键。

    【讨论】:

      【解决方案2】:

      对于您的move 密钥,您所做的一切都很好。

      对于您的 sprint 按钮,使用 KeyAdapter#keyPressed 记录按键被按下的时间,使用 KeyAdapter#keyReleased 记录按键被释放的时间(例如,将其存储在 boolean 中)。

      然后,当您的移动事件发生时,检查布尔值以查看您是在步行还是在冲刺。例如,这里有一个键适配器,它记录当前按下了哪些键。

      Set<Integer> pressed = new HashSet<>();
      this.addKeyListener(new KeyAdapter() {
              public void keyPressed(KeyEvent arg0) {
                  pressed.add(arg0.getKeyCode());
              }
      
              public void keyReleased(KeyEvent arg0) {
                  pressed.remove(arg0.getKeyCode());
              }
          });
      // if pressed.contains(keyCode), that key is currently being held
      

      【讨论】:

      • 我试过了,但除非我做错了,否则每当我按下第二个按钮时,它都会取消按住按钮的移动按钮,所以你必须再次按下箭头键。有没有办法解决这个问题?我做错了吗?
      • @user3838829 您可能做错了,但由于您尚未发布该代码,因此我无法进一步评论。您可能还应该使用keyTyped 事件来检测您的非按住按钮。
      • 我的尝试是:link。它仍然需要这个人先按 Enter 来冲刺,然后用箭头键移动。但是,按箭头键,然后输入会阻止播放器继续运行
      猜你喜欢
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      相关资源
      最近更新 更多