Уроки · 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 на это:
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.