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ならすべてのエンティティを近い順に返します。 - 結果は聞いた時点の位置にもとづきます。物が動いたら、もう一度聞いてください。