Определение функциональности отдельных и одновременных нажатий клавиш - PullRequest
0 голосов
/ 08 марта 2020

EDIT # 1:

После некоторой игры у меня есть несколько различных тестов:

  1. Условия записи, которые указывают, что ключ не закодирован (alphanumeri c key прессы не регистрируются или не работают)
float x = 50;
float y = 50;
float x2 = 40;
float y2 = 40;
void setup() {
  size(100, 100);
}

void draw() {
  background(0);
  rect(x, y, 10, 10);
  rect(x2, y2, 10, 10);
}

void keyPressed() {
  if (keyPressed) {
    if (key == CODED) {
      if (keyCode == LEFT) {
        x = x - 10;
        println("LEFT KEY PRESS; Square #1 moves LEFT", x);
      } else if (keyCode == RIGHT) {
        x = x + 10;
        println("RIGHT KEY PRESS; Square #1 moves RIGHT", x);
      } else if (keyCode == UP) {
        y = y - 10;
        println("UP KEY PRESS; Square #1 moves UP", y);
      } else if (keyCode == DOWN) {
        y = y + 10;
        println("DOWN KEY PRESS; Square #1 moves DOWN", y);
      } else if (key != CODED && key == 'a') {
        x2 = x2 - 10;
        println("'a' KEY PRESS; Square #2 moves LEFT", x2);
      } else if (key != CODED && key == 'd') {
        x2 = x2 + 10;
        println("'d' KEY PRESS; Square #2 moves RIGHT", x2);
      } else if (key != CODED && key == 'w') {
        y2 = y2 - 10;
        println("'w' KEY PRESS; Square #2 moves UP", y2);
      } else if (key != CODED && key == 's') {
        y2 = y2 + 10;
        println("'s' KEY PRESS; Square #2 moves DOWN", y2);
      }
    }
  }
}
Запустить отдельную цепочку условных обозначений для alphanumeri c Проверки с нажатой клавишей (alphanumeri c нажатия клавиш не регистрируются или не работают)
float x = 50;
float y = 50;
float x2 = 40;
float y2 = 40;
void setup() {
  size(100, 100);
}

void draw() {
  background(0);
  rect(x, y, 10, 10);
  rect(x2, y2, 10, 10);
}
void keyPressed() {
  if (keyPressed) {
    if (key == CODED) {
      if (keyCode == LEFT) {
        x = x - 10;
        println("LEFT KEY PRESS; Square #1 moves LEFT", x);
      } else if (keyCode == RIGHT) {
        x = x + 10;
        println("RIGHT KEY PRESS; Square #1 moves RIGHT", x);
      } else if (keyCode == UP) {
        y = y - 10;
        println("UP KEY PRESS; Square #1 moves UP", y);
      } else if (keyCode == DOWN) {
        y = y + 10;
        println("DOWN KEY PRESS; Square #1 moves DOWN", y);

        if (keyPressed) {
          if (key == 'a') {
            x2 = x2 - 10;
            println("'a' KEY PRESS; Square #2 moves LEFT", x2);
          } else if (key == 'd') {
            x2 = x2 + 10;
            println("'d' KEY PRESS; Square #2 moves RIGHT", x2);
          } else if (key == 'w') {
            y2 = y2 - 10;
            println("'w' KEY PRESS; Square #2 moves UP", y2);
          } else if (key == 's') {
            y2 = y2 + 10;
            println("'s' KEY PRESS; Square #2 moves DOWN", y2);
          }
        }
      }
    }
  }
}
Проверьте наличие букв alphanumeri c перед проверкой кодированных ключей во вложенной цепочке (кажется, что регистрирует все нажатия клавиш и выводит правильные результаты на консоль, и регистрирует как минимум два одновременных нажатия клавиш, но программа только продолжит функционировать как и предназначено для первого нажатия клавиши, когда оба удерживаются)
float x = 50;
float y = 50;
float x2 = 40;
float y2 = 40;
void setup() {
  size(100, 100);
}

void draw() {
  background(0);
  rect(x, y, 10, 10);
  rect(x2, y2, 10, 10);
}

void keyPressed() {
  if (keyPressed) {
    if (key == 'a') {
      x2 = x2 - 10;
      println("'a' KEY PRESS; Square #2 moves LEFT", x2);
    } else if (key == 'd') {
      x2 = x2 + 10;
      println("'d' KEY PRESS; Square #2 moves RIGHT", x2);
    } else if (key == 'w') {
      y2 = y2 - 10;
      println("'w' KEY PRESS; Square #2 moves UP", y2);
    } else if (key == 's') {
      y2 = y2 + 10;
      println("'s' KEY PRESS; Square #2 moves DOWN", y2);
    } else if (key == CODED) {
      if (keyCode == LEFT) {
        x = x - 10;
        println("LEFT KEY PRESS; Square #1 moves LEFT", x);
      } else if (keyCode == RIGHT) {
        x = x + 10;
        println("RIGHT KEY PRESS; Square #1 moves RIGHT", x);
      } else if (keyCode == UP) {
        y = y - 10;
        println("UP KEY PRESS; Square #1 moves UP", y);
      } else if (keyCode == DOWN) {
        y = y + 10;
        println("DOWN KEY PRESS; Square #1 moves DOWN", y);
      }
    }
  }
}

Хотя я не предвидел продолжения исходной проблемы, проблема немного изменилась, чтобы охватить одновременные продолженные проверки нажатия клавиш .

Для третьего контрольного примера результаты аналогичны для комбинаций нажатий клавиш alphanumeri c only, alphanumeri c и кодированных и только кодированных клавиш; движение начинается, но продолжается только в зависимости от того, какая клавиша была нажата первой.

Насколько мне известно, опция keyHeld отсутствует. Существует опция keyReleased, но я предполагаю, что это не решение здесь. Я попытался использовать && для проверки двух ключей, но это не работает для alphanumeri c ключей (выдает ошибку «Оператор && не определен для типа (ов) аргумента char, char») .




Оригинальный пост: я сейчас работаю над репликацией PONG и у меня возникают проблемы с работой обоих манипуляторов. Я написал следующий код в существующую программу, чтобы изменить позицию Y каждого весла, и добавил операторы println(), чтобы увидеть, что происходит:

...

void keyPressed(){
  if (keyPressed){
    if (key == CODED){
      if (keyCode == UP){
        paddle_Y = paddle_Y - 20;
        println("UP");
      } else if (keyCode == DOWN){
        paddle_Y = paddle_Y + 20;
        println("DOWN");
      }
  if (keyPressed){
    if (key == 'w'){
      paddle_Y2 = paddle_Y2 - 20;
      println(key);
    } else if (key == 's'){
      paddle_Y2 = paddle_Y2 + 20;
      println(key);
        }
      }
    }
  }
  println(paddle_Y, paddle_Y2);
}

Для этого сегмента println("UP");, println("DOWN");, и println(paddle_Y, paddle_Y2); работают должным образом, при этом консоль отображает результаты, подобные следующим:

UP
480, 500
DOWN
500, 500
DOWN
520, 500
UP
500, 500
**'s' is pressed but does not print**
500, 500
**'w' is pressed but does not print**
500, 500
...

Текущая функциональность такова, что одно весло движется, а другое - нет. В другой попытке изолировать проблему, я попытался сделать это как отдельную программу:

float x = 100;
float x2 = 100;

void setup(){
size(200, 200);
}

void keyPressed(){

  if (keyPressed){
    if (key == CODED){
      if (keyCode == UP){
        x = x - 20;
        println("UP");
      } else if (keyCode == DOWN){
        x = x + 20;
        println("DOWN");
      }
  if (keyPressed){
    if (key == 'w'){
      x2 = x2 - 20;
      println(key);
    } else if (key == 's'){
      x2 = x2 + 20;
      println(key);
        }
      }
    }
  }
   println(x, x2);
}

И в этой программе вообще ничего не регистрируется и строки не выводятся на консоль.

Я склонен полагать, что нажатие клавиши не регистрируется должным образом, но я не уверен, где ошибка. Я пробовал это как на Windows 10, так и на любой последней версии ОС Ma c.

1 Ответ

0 голосов
/ 08 марта 2020
/* this is the same code as the 2nd example in the OP, just reformatted */

void keyPressed() {

  if (keyPressed) {
    if (key == CODED) {
      if (keyCode == UP) {
        x = x - 20;
        println("UP");
      } else if (keyCode == DOWN) {
        x = x + 20;
        println("DOWN");
      }
      if (keyPressed) {
        if (key == 'w') {
          x2 = x2 - 20;
          println(key);
        } else if (key == 's') {
          x2 = x2 + 20;
          println(key);
        }
      }
    }
  }
  println(x, x2);
}

То, как ваш код подразумевает его работу (на основе форматирования в вашем посте), и фактическое форматирование, когда вы выстраиваете скобки, возможно, является частью вашей проблемы. Вы не опубликовали полный воспроизводимый пример, поэтому трудно понять, должно ли key == CODED быть истинным во всех случаях или нет, но сейчас ваше горизонтальное движение находится внутри крайних 2 if утверждений. Это намеренно?

...