Уроки · 20
Радиус обнаружения
В уроке «Расстояние» мы научились находить число —
сколько пикселей между двумя точками. Само по себе это число мало
что значит, но его можно сравнить с другим числом — точно тем же
if, что и в уроке «Иначе», только вместо “нажата ли
кнопка” теперь условие “расстояние меньше радиуса”.
Так работает обнаружение в играх: у турели есть радиус обзора, и если игрок оказался ближе этого радиуса — турель его заметила.
if distance < radius { // игрок рядом} else { // игрок далеко}Попробуй сам
Заголовок раздела «Попробуй сам»Синий кружок в центре — турель, серый контур вокруг — её радиус обнаружения. Белый кружок под курсором — игрок. Заведи его внутрь контура — турель покраснеет. Меняй радиус ниже:
use macroquad::prelude::*;
// Радиус один и тот же на каждом кадре, поэтому это константа// (как в уроке «Константы»), а не переменная внутри loop.const RADIUS: f32 = 300.0;
#[macroquad::main("Радиус обнаружения")]async fn main() { loop { clear_background(BLACK);
// Центр экрана — здесь же стоит турель. let center_x = screen_width() / 2.0; let center_y = screen_height() / 2.0;
// Координаты курсора. let (mouse_x, mouse_y) = mouse_position();
// Расстояние от турели до курсора (как в уроке «Расстояние»). let dx = mouse_x - center_x; let dy = mouse_y - center_y; let distance = (dx * dx + dy * dy).sqrt();
// Контур — радиус обнаружения турели. draw_circle_lines(center_x, center_y, RADIUS, 3.0, GRAY);
// Турель красная, если игрок внутри радиуса, иначе синяя. if distance < RADIUS { draw_circle(center_x, center_y, 40.0, RED); } else { draw_circle(center_x, center_y, 40.0, BLUE); }
// Игрок — кружок под курсором. draw_circle(mouse_x, mouse_y, 25.0, WHITE);
next_frame().await; }}Что здесь происходит
Заголовок раздела «Что здесь происходит»distance— то же самое расстояние от центра до курсора, что и в прошлом уроке.if distance < RADIUS { ... } else { ... }— сравнивает расстояние с радиусом:<значит “меньше”. Если курсор ближе радиуса — условие верно, и турель рисуется красной; если дальше — синей.RADIUSнаписана заглавными буквами и объявлена внеmain— как в уроке «Константы»: её значение не зависит от кадра, так что пересчитывать её внутриloopнезачем.- Серый контур сам по себе ничего не проверяет, он просто рисует границу — чтобы было видно, где именно проходит тот самый радиус, с которым сравнивается расстояние.