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

Уроки · 20

Радиус обнаружения

В уроке «Расстояние» мы научились находить число — сколько пикселей между двумя точками. Само по себе это число мало что значит, но его можно сравнить с другим числом — точно тем же if, что и в уроке «Иначе», только вместо “нажата ли кнопка” теперь условие “расстояние меньше радиуса”.

Так работает обнаружение в играх: у турели есть радиус обзора, и если игрок оказался ближе этого радиуса — турель его заметила.

if distance < radius {
// игрок рядом
} else {
// игрок далеко
}

Синий кружок в центре — турель, серый контур вокруг — её радиус обнаружения. Белый кружок под курсором — игрок. Заведи его внутрь контура — турель покраснеет. Меняй радиус ниже:

src/main.rs
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 незачем.
  • Серый контур сам по себе ничего не проверяет, он просто рисует границу — чтобы было видно, где именно проходит тот самый радиус, с которым сравнивается расстояние.