Перейти к содержимому

Уроки · 73

WASD или стрелки

В уроке «Движение» кружок едет только по стрелкам. А во многих играх одно и то же действие можно вызвать разными клавишами — кто-то привык к стрелкам, кто-то к WASD. Добавим вторую раскладку, не ломая первую.

&& из урока «Круглые кнопки» означал «и то, и другое одновременно». У || смысл обратный — «хотя бы одно из двух». Он тоже берёт два bool и отвечает на один вопрос, только другой: верно ли хотя бы одно из двух, первое или второе.

  • Если хотя бы одно из двух — true, результат true.
  • false получится только тогда, когда оба условия неверны сразу.
let up = is_key_down(KeyCode::Up) || is_key_down(KeyCode::W);

Кружок едет вверх, если зажата стрелка вверх или W — неважно, какая именно, можно зажать и обе сразу: от этого ничего не изменится, up всё равно останется true.

Замени содержимое src/main.rs на это:

src/main.rs
use macroquad::prelude::*;
// Скорость движения — одна и та же на каждом кадре, как в уроке «Константы».
const SPEED: f32 = 8.0;
#[macroquad::main("WASD или стрелки")]
async fn main() {
// Начинаем с центра экрана.
let mut x = screen_width() / 2.0;
let mut y = screen_height() / 2.0;
loop {
clear_background(BLACK);
// Стрелка вверх или W — двигаем вверх на SPEED пикселей за кадр.
if is_key_down(KeyCode::Up) || is_key_down(KeyCode::W) {
y -= SPEED;
}
// Стрелка вниз или S — двигаем вниз на SPEED пикселей за кадр.
if is_key_down(KeyCode::Down) || is_key_down(KeyCode::S) {
y += SPEED;
}
// Стрелка влево или A — двигаем влево на SPEED пикселей за кадр.
if is_key_down(KeyCode::Left) || is_key_down(KeyCode::A) {
x -= SPEED;
}
// Стрелка вправо или D — двигаем вправо на SPEED пикселей за кадр.
if is_key_down(KeyCode::Right) || is_key_down(KeyCode::D) {
x += SPEED;
}
draw_circle(x, y, 75.0, YELLOW);
next_frame().await;
}
}

Запусти как обычно:

Окно терминала
cargo run

Подвигай кружок и стрелками, и WASD — по отдельности и вперемешку. Вот так это выглядит — можно попробовать прямо здесь (клик по демо переносит на него фокус клавиатуры):

  • || — логическое ИЛИ: true, если хотя бы одно из двух условий верно, false — только если оба неверны. Пара к && из урока «Круглые кнопки», только там нужны были оба условия сразу, а здесь достаточно любого одного.
  • is_key_down(KeyCode::Up) || is_key_down(KeyCode::W) — движение вверх срабатывает от любой из двух клавиш, и не важно, нажата ли только одна или сразу обе.
  • Остальные три направления устроены точно так же — пара клавиш через || на каждое.
  • Сама логика движения не изменилась по сравнению с уроком «Движение» — поменялось только условие внутри if.