pyxen.world.near()

ある点から半径内にあるエンティティを、近い順に返します。

world.near(x, y, radius, *components, without=None)

位置が (x, y) から radius 以内(距離が radius 以下)にあるエンティティを、近い順に返します。同じ距離のものは常に同じ順に並びます。コンポーネントと without は world.all() と同じように働きます。コンポーネントを指定しなければ、すべてのエンティティが対象です。

エンティティが多くても高速です。Pyxen は位置ごとのグリッドにエンティティを入れ、円がかかる場所だけを調べます。近くの敵を探す弾は、敵が 50 体でも 5000 体でもほぼ同じコストです。


パラメータ

パラメータ型説明
xfloat点の x(ワールドのピクセル)
yfloat点の y(ワールドのピクセル)
radiusfloat点からの距離(ピクセル)。0 なら点の上にあるものを見つけます
*componentsstrエンティティがすべて持っていなければならないコンポーネント名(world.all() と同じ)
withouttupleエンティティが持っていてはならないコンポーネント名

当たる弾

ゲーム中のすべての敵を調べずに、各弾が触れた敵にダメージを与えます。

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