【问题标题】:Java: Recognizing keyPressed only once per pressJava:每次按下仅识别一次keyPressed
【发布时间】:2014-12-09 18:01:18
【问题描述】:

我正在用 Java 制作一个游戏,我希望能够走到一个 NPC 面前并按下空格与他们交谈。但是,我的 KeyBoard 类现在面向移动键(wasd 和左下右),它总是识别按下以保持玩家移动。我将如何设置它,以便空格键只有在按下后才能被识别,并且在玩家释放它并再次按下它之前无法识别?

public class Keyboard implements KeyListener
{

    private boolean[] keys = new boolean[120];

    public boolean up, down, left, right, interact;

    public void update() 
    {
        up = keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W];
        down = keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S];
        left = keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A];
        right = keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D];
        interact = keys[KeyEvent.VK_SPACE];
    }

    public void keyPressed(KeyEvent e) 
    {
        keys[e.getKeyCode()] = true;
    }

    public void keyReleased(KeyEvent e) 
    {
        keys[e.getKeyCode()] = false;
    }
}

【问题讨论】:

  • 创建一个获取值的retrieveAndReset 方法,如果true 将其设置为false?无论如何,方法应该优先于直接变量访问,您不需要update() 方法。您可能不想在释放它时重置空格键值;短按键也应该被注册。

标签: java keylistener


【解决方案1】:
Set<Integer> pressedKeys = new TreeSet<Integer>();

public void keyPressed(KeyEvent ke) {
  int code = ke.getKeyCode();
  Integer val = Integer.valueOf(code);
  if (pressedKeys.contains(val)) {
    //we've already pressed the key and it is being held down
    return;
  }
  else {
    //process key event
  }
}

public void keyReleased(KeyVEnt ke) {
  pressedKeys.remove(ke.getKeyCode());
}

【讨论】:

    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 2016-02-09
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多