Как мне остановить движение моей фигуры с помощью нажатия клавиш? - PullRequest
1 голос
/ 09 апреля 2020

Как мне заставить мою форму останавливаться каждый раз, когда я нажимаю клавишу пробела, и двигаться, когда я нажимаю клавишу пробела снова?

1 Ответ

2 голосов
/ 09 апреля 2020

Чтобы приостановить и возобновить обновление позиции, вам нужно создать отдельную переменную для отслеживания этого изменения состояния: в этом случае идеально подходит логическое значение.

например,

boolean shouldSquareUpdate = true;

Вы можете использовать keyPressed() для прослушивания изменений ключа в обработке:

void draw(){
}
void keyPressed(){
  println("key: " + key + " keyCode: " + keyCode);
}

Следующая часть переключает логическое значение:

  • , если значение было true, установите его на false
  • , если оно было false, установите на true

например

void keyPressed(){
  // toggle boolean (if true, set it to false, if false, set it to true)
  if(shouldSquareUpdate == true){
    shouldSquareUpdate = false;
  }else{
    shouldSquareUpdate = true;
  }
}

Эту проблему можно решить более элегантно с помощью логического оператора NOT , который по существу переворачивает логическое состояние:

void keyPressed(){
  // toggle boolean (if true, set it to false, if false, set it to true)
  shouldSquareUpdate = !shouldSquareUpdate;
}

Наконец, вы должны использовать это условие, чтобы определить, является ли y значение должно быть обновлено (или нет):

// update only if value is true
  if(shouldSquareUpdate){
    y += dy;
  }

Полный эскиз будет выглядеть так:

int x = 0;
int y = 0;

int dy = 1;

boolean shouldSquareUpdate = true;

void setup() {
  size(1280, 720);
  surface.setResizable(true);
}

void draw() {
  background(240, 240, 240);
  fill(255, 147, 79);
  rect(x, y, 90, 90);
  // update only if value is true
  if(shouldSquareUpdate){
    y += dy;
  }
  if(y + 90 > height || y < 0) {
    dy *= -1;
  }
}

void keyPressed(){
  // toggle boolean (if true, set it to false, if false, set it to true)
  shouldSquareUpdate = !shouldSquareUpdate;
}

Относительно

как мне сделать мой квадратное движение за 8 равных шагов?

Это должно быть вопросом простого обновления значения dy, которое вы в настоящее время устанавливаете на 1 (пиксель p er frame) быть восьмой от общего расстояния перемещения (высоты):

например

// in setup()
dy = height / 8;

Имейте в виду, что 720/8 = 90 пикселей на кадр с 60 кадрами в секунду это было бы 5400 пикселей в секунду: как быстро, чтобы движение было разборчивым.

Вы можете использовать тот же принцип, чтобы, возможно, переместить блок на 32 равных шага? например,

void setup() {
  size(1280, 720);
  surface.setResizable(true);
  // make square move in 32 equal steps: increment 32th of the total height
  dy = height / 32;
}
...