Уроки · 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 на это:
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осталась обычной, неизменяемой переменной — высота, на которой едет кружок, не меняется.