Обработка 3.3.7 - переменная «клавиша» не всегда представляет последнюю нажатую клавишу - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь создать эскиз, который будет использовать клавиши WASD для перемещения символа по экрану в IDE обработки 3.3.7.

У меня проблема, когда одна клавиша отпущена, а другая нажата одновременно, переменная key не изменится на новый ввод в течение примерно секунды. Я сократил код обиды на это:

void draw(){
  println(key);
}

С помощью этого кода вы можете видеть, что когда вы отпускаете одну клавишу и начинаете удерживать другую в максимально близкой последовательности (возможно, только в одном кадре), напечатанное значение не изменится в течение секунды (может отличаться в зависимости от того, что вы время повтора ключа). Это действительно раздражает, и я не знаю, как обойти это.

Спасибо за чтение!

1 Ответ

0 голосов
/ 02 сентября 2018

Функция println() общеизвестно плоха во времени, поэтому я бы не стал доверять ей в таких микропроцессорах.

Кроме того, переменная key содержит последнюю нажатую клавишу, которая может быть клавишей, которую вы отпустили вместо клавиши, которую вы нажали. Например, подумайте об этой последовательности событий:

  • Я нажимаю клавишу a. Переменная key становится a.
  • Я нажимаю клавишу s. переменная key становится s.
  • Теперь я отпускаю клавишу a. переменная key переключается обратно на a.
  • Я все еще держу клавишу s, поэтому через секунду моя клавиатура вызывает другое событие клавиши s, переключая переменную key на s.

Если вы хотите более детального управления событиями клавиатуры, я предлагаю использовать такие функции, как 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;
  }
}

Бесстыдная самореклама: здесь - учебник по обработке входных событий. См. обработку нескольких нажатий клавиш , чтобы узнать больше об этом подходе.

...