Уроки · 8
Движение
Всё для этого уже есть по отдельности: is_key_down говорит, какая
клавиша зажата, а mut разрешает менять x и y. Остаётся соединить
одно с другим: пока клавиша зажата — понемногу двигать x или y в
её сторону. Для движения в одну сторону пригодится += из урока
«Изменяемые переменные», а для движения в обратную —
-=, ровно то же самое, только отнимает, а не прибавляет.
Замени содержимое src/main.rs на это:
use macroquad::prelude::*;
#[macroquad::main("Движение")]async fn main() { // Начинаем с центра экрана. let mut x = screen_width() / 2.0; let mut y = screen_height() / 2.0;
loop { clear_background(BLACK);
// Стрелка вверх — двигаем вверх на 8 пикселей за кадр. if is_key_down(KeyCode::Up) { y -= 8.0; } // Стрелка вниз — двигаем вниз на 8 пикселей за кадр. if is_key_down(KeyCode::Down) { y += 8.0; } // Стрелка влево — двигаем влево на 8 пикселей за кадр. if is_key_down(KeyCode::Left) { x -= 8.0; } // Стрелка вправо — двигаем вправо на 8 пикселей за кадр. if is_key_down(KeyCode::Right) { x += 8.0; }
draw_circle(x, y, 75.0, YELLOW);
next_frame().await; }}Запусти как обычно:
cargo runСтрелки двигают кружок в свою сторону, и пока клавиша зажата, он едет дальше. Вот так это выглядит — можно попробовать прямо здесь (клик по демо переносит на него фокус клавиатуры):
Что здесь происходит
Заголовок раздела «Что здесь происходит»- Все четыре
ifпроверяются на каждом кадре независимо друг от друга — зажатых клавиш может быть сразу несколько. - Попробуй зажать вверх и вниз одновременно:
y -= 8.0иy += 8.0выполняются на одном и том же кадре и компенсируют друг друга —yостаётся на месте, кружок не двигается по вертикали. То же самое с левой и правой стрелками. - А если зажать, например, вверх и вправо вместе —
yиxменяются одновременно, каждая сама по себе, и кружок едет по диагонали.