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

Уроки · 31

Случайная точка

До сих пор в наших уроках все числа были заранее известны — центр экрана, скорость, радиус. Но иногда нужно наоборот: число, которое никто заранее не знает, — как в игре в кости. Для этого в macroquad есть готовая функция.

// Случайное число от 0 (включительно) до 10 (не включая).
let n = rand::gen_range(0.0, 10.0);

rand::gen_range(a, b) возвращает случайное число где-то между a и b. Каждый раз новое, никак не связанное с предыдущим.

Замени содержимое 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);
// Кнопка мыши только что нажата — новая случайная точка.
if is_mouse_button_pressed(MouseButton::Left) {
// Случайное число от 0 до ширины экрана.
x = rand::gen_range(0.0, screen_width());
// Случайное число от 0 до высоты экрана.
y = rand::gen_range(0.0, screen_height());
}
draw_circle(x, y, 40.0, YELLOW);
next_frame().await;
}
}

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

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

Кружок стоит по центру. Кликни где угодно на демке — неважно, где именно, — кружок прыгнет в случайную точку. Кликни ещё раз — окажется уже в другой:

  • rand::gen_range(0.0, screen_width()) — случайное число от 0 до ширины экрана: x может оказаться где угодно по горизонтали, от самого левого края до самого правого.
  • То же самое для y, только с высотой экрана — получаем случайную точку по всему экрану, а не только по одной оси.
  • Считаем заново только по клику, а не каждый кадр: иначе кружок бы дрожал на месте, меняя точку 60 раз в секунду, а не ждал следующего нажатия.
  • x и y объявлены вне loop — кружок должен помнить свою случайную точку между кадрами, а не только в момент клика (как в «Где живёт переменная»).