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

Уроки · 9

Константы

В уроке “Движение” число 8.0 написано в коде четыре раза — по разу на каждое направление. Если захочется сделать движение быстрее, придётся находить и менять все четыре места, и легко одно из них пропустить.

У переменной — даже неизменяемой, через let — значение появляется только в момент, когда до этой строки доходит выполнение программы, то есть когда игра уже запущена. У константы иначе: значение известно заранее, ещё до всякого запуска — это просто число, написанное прямо в коде, и оно всегда одно и то же.

const SPEED: f32 = 8.0;

Дальше в коде можно писать SPEED вместо 8.0, и это будет то же самое число.

Именно потому, что значение известно заранее, константу можно объявить прямо вне функции main — и тем более вне loop. Для сравнения: x и y в уроке “Движение” объявлены внутри main, потому что их начальное значение (screen_width() / 2.0) вычисляется только когда игра уже запущена — раньше этого узнать неоткуда. А SPEED не зависит от игры вообще: это число 8.0, и оно одно и то же что до запуска, что после — поэтому ему незачем ждать, пока main начнёт выполняться.

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

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

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

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

Ведёт себя точно так же, как в уроке “Движение” — само число теперь просто живёт в одном месте:

  • SPEED написано заглавными буквами — так принято называть константы в Rust, чтобы сразу отличать их от обычных переменных.
  • Если теперь захочется сделать движение быстрее, достаточно поменять число один раз — в строке const SPEED: f32 = 8.0; — и это сразу подействует на все четыре направления.