Уроки · 31
Случайная точка
До сих пор в наших уроках все числа были заранее известны — центр экрана, скорость, радиус. Но иногда нужно наоборот: число, которое никто заранее не знает, — как в игре в кости. Для этого в macroquad есть готовая функция.
// Случайное число от 0 (включительно) до 10 (не включая).let n = rand::gen_range(0.0, 10.0);rand::gen_range(a, b) возвращает случайное число где-то между a и
b. Каждый раз новое, никак не связанное с предыдущим.
Замени содержимое 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— кружок должен помнить свою случайную точку между кадрами, а не только в момент клика (как в «Где живёт переменная»).