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

Уроки · 8

Движение

Всё для этого уже есть по отдельности: is_key_down говорит, какая клавиша зажата, а mut разрешает менять x и y. Остаётся соединить одно с другим: пока клавиша зажата — понемногу двигать x или y в её сторону. Для движения в одну сторону пригодится += из урока «Изменяемые переменные», а для движения в обратную — -=, ровно то же самое, только отнимает, а не прибавляет.

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

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 меняются одновременно, каждая сама по себе, и кружок едет по диагонали.