处理3.3.7-“键”变量并不总是代表最后按下的键

时间:2018-09-02 12:49:03

标签: java input key processing

我正在尝试创建一个草图,该草图将使用WASD键在Processing 3.3.7 IDE中在屏幕上移动字符。

当释放一个键并同时按下另一个键时,我遇到一个问题,key变量将在大约一秒钟的时间内不会更改为新输入。我将令人讨厌的代码缩减为:

void draw(){
  println(key);
}

使用此代码,您可以看到,当您释放一个键并开始尽可能连续地紧紧握住另一个键(可能仅在同一帧上)时,打印值将不会改变约一秒钟(可能会有所不同,具体取决于您的内容)。键重复时间)。这真的很烦人,我不知道该如何解决。

感谢阅读!

1 个答案:

答案 0 :(得分:0)

众所周知,println()函数的计时性很差,所以我不相信它会像这样的微基准测试。

此外,key变量保留与之交互的最后一个键,该键可能是您释放的键,而不是您按下的键。例如,考虑以下事件序列:

  • 我按a键。 key变量变为a
  • 我按s键。 key变量变为s
  • 现在我松开a键。 key变量切换回a
  • 我仍然按住s键,所以一秒钟之后,键盘触发了另一个s键事件,将key变量切换为s
  • li>

如果您想对键盘事件进行更细粒度的控制,建议您使用keyPressed()keyReleased()之类的事件函数。您可能想使用事件函数中设置的一组变量来跟踪按下了哪些键。这是一个示例:

boolean aPressed = false;
boolean sPressed = false;

void draw(){
  if(aPressed){
    // a is pressed
  }
  if(sPressed){
    // s is pressed
  }
}

void keyPressed(){
  if(key == 'a'){
    aPressed = true;
  }
  else if(key == 's'){
    sPressed = true;
  }
}

void keyReleased(){
  if(key == 'a'){
    aPressed = false;
  }
  else if(key == 's'){
    sPressed = false;
  }
}

无耻的自我促进:here是有关处理输入事件的教程。请参阅处理多次按键部分,以详细了解此方法。