pyxen.world.near()
한 점에서 반경 안에 있는 엔티티를 가까운 순서로 돌려줍니다.
world.near(x, y, radius, *components, without=None)
위치가 (x, y)에서 radius 이내(거리가 radius 이하)인 엔티티를 가까운 순서로 돌려줍니다. 거리가 같은 둘은 항상 같은 순서로 옵니다. 컴포넌트와 without은 world.all()과 같이 동작합니다. 컴포넌트를 주지 않으면 모든 엔티티가 대상입니다.
엔티티가 많아도 빠릅니다. Pyxen은 엔티티를 위치별 격자에 넣어 두고 원이 걸치는 곳만 살핍니다. 그래서 가까운 적을 찾는 총알 하나의 비용은 적이 50마리일 때와 5000마리일 때가 거의 같습니다.
매개변수
| 매개변수 | 타입 | 설명 |
|---|---|---|
x | float | 점의 x, 월드 픽셀 단위 |
y | float | 점의 y, 월드 픽셀 단위 |
radius | float | 점에서의 거리, 픽셀 단위. 0이면 점 위에 있는 것을 찾습니다 |
*components | str | 엔티티가 모두 가져야 하는 컴포넌트 이름 (world.all()과 같음) |
without | tuple | 엔티티가 가지면 안 되는 컴포넌트 이름 |
맞히는 총알
게임의 모든 적을 검사하지 않고, 각 총알이 닿은 적에게 피해를 줍니다:
for shot in world.all("shot"):
for foe in world.near(shot.x, shot.y, 10, "foe"):
foe.foe.hp -= 1
if foe.foe.hp <= 0:
world.destroy(foe)
여기서 제거한 적은 이 총알에도, 다음 총알에도 다시 나오지 않습니다.
자동 조준
첫 번째 엔티티가 가장 가깝기 때문에 next로 가져올 수 있고, 범위 안에 없으면 None입니다:
hero = world.get(name="hero")
target = next(world.near(hero.x, hero.y, 120, "foe", without=("dead",)), None)
if target is not None:
fire_at(target.x, target.y)
타워도 같은 방법으로, 자기 위치와 사거리에서 목표를 고릅니다.
위치
거리는 점과 각 엔티티의 월드 위치 사이에서 잽니다. 부모의 위치, 회전, 크기를 거친 x와 y, 즉 그려지는 자리입니다. 루트에 있는 엔티티나, 회전하거나 크기가 바뀌지 않는 (0, 0)의 부모 아래 있는 엔티티(보통의 레벨에 있는 적)에게는 그것이 곧 x와 y입니다.
같은 프레임에서 먼저 쓴 위치는 바로 반영됩니다. 총알을 옮긴 다음 그 근처에 무엇이 있는지 물어보세요.
예외 상황
- 음수 반경은 아무것도 찾지 않습니다.
math.inf는 모든 엔티티를 가까운 순서로 찾습니다. - 결과는 물어본 순간의 위치를 말합니다. 물체가 움직인 뒤에는 다시 물어보세요.