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

Уроки · 7

Изменяемые переменные

До сих пор переменные вычислялись один раз и больше не менялись. А что, если значение должно меняться, пока игра работает — например, координата кружка, который должен ехать по экрану?

По умолчанию переменную в Rust нельзя изменить после создания. Чтобы разрешить это, добавляется слово mut:

// mut разрешает менять x после создания.
let mut x = screen_width() / 2.0;

Теперь x можно менять дальше по коду.

Изменить значение можно так:

// x становится равен своему же значению плюс 1.0.
x = x + 1.0;

Это значит: x становится равен своему же старому значению плюс 1.0. Для такой записи в Rust есть более короткий способ:

// То же самое, что x = x + 1.0;, только короче.
x += 1.0;

Работает точно так же, просто короче.

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

src/main.rs
use macroquad::prelude::*;
#[macroquad::main("Изменяемые переменные")]
async fn main() {
// Начинаем с центра экрана.
let mut x = screen_width() / 2.0;
let y = screen_height() / 2.0;
loop {
clear_background(BLACK);
// Каждый кадр x становится на 1.0 больше — кружок едет вправо.
x += 1.0;
draw_circle(x, y, 100.0, YELLOW);
next_frame().await;
}
}

x объявлена до loop, а не внутри него — и это важно. Если бы let x = ...; стояла внутри loop, на каждом кадре заново создавалась бы новая переменная x, снова равная центру экрана, — а то, что успело накопиться за предыдущие кадры, терялось бы вместе со старой переменной. x += 1.0 всякий раз добавляла бы единицу к этому свежему числу, но на следующем кадре всё начиналось бы заново, и кружок просто стоял бы на месте. А когда x создаётся один раз, до loop, в самом начале игры — это одна и та же переменная хранит текущую позицию кружка кадр за кадром: += 1.0 каждый раз прибавляет к тому, что в ней уже накопилось, а не создаёт её заново.

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

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

Кружок сам, без нажатия каких-либо клавиш, едет вправо — потому что x увеличивается на каждом кадре. Вот так это выглядит: поле x ниже показывает текущее значение переменной прямо из игры и само обновляется по мере того, как кружок едет, а если вписать туда своё число — кружок сразу же перепрыгнет на него и продолжит ехать дальше уже оттуда:

  • let mut x = ...; — mut разрешает менять x после создания. Без него строка x += 1.0; будет считаться ошибкой, и программа не запустится.
  • x += 1.0; — на каждом кадре x становится на 1.0 больше, поэтому кружок непрерывно едет вправо.
  • y осталась обычной, неизменяемой переменной — высота, на которой едет кружок, не меняется.