pyxen.world.near()
Die Entitäten im Umkreis eines Punktes, die nächste zuerst.
world.near(x, y, radius, *components, without=None)
Gibt die Entitäten zurück, deren Position höchstens radius von (x, y) entfernt ist, die nächste zuerst. Zwei im gleichen Abstand kommen immer in derselben Reihenfolge. Komponenten und without funktionieren wie bei world.all(); ohne Komponente zählt jede Entität.
Das ist auch bei vielen Entitäten schnell: Pyxen hält sie in einem Raster nach Position und sieht nur dort nach, wo der Kreis liegt. Ein Schuss, der nach den Gegnern in seiner Nähe fragt, kostet bei 50 Gegnern etwa so viel wie bei 5000.
Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
x | float | Das x des Punktes, in Weltpixeln |
y | float | Das y des Punktes, in Weltpixeln |
radius | float | Wie weit vom Punkt, in Pixeln. 0 findet, was genau darauf steht |
*components | str | Komponentennamen, die eine Entität alle haben muss, wie bei world.all() |
without | tuple | Komponentennamen, die eine Entität nicht haben darf |
Ein Schuss, der trifft
Jeder Schuss verletzt die Gegner, die er berührt, ohne jeden Gegner im Spiel zu prüfen:
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)
Ein hier zerstörter Gegner wird nie wieder gefunden, weder von diesem Schuss noch vom nächsten.
Automatisches Zielen
Die erste Entität ist die nächste, also nimmt next sie, oder None, wenn keine in Reichweite ist:
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)
Ein Turm wählt sein Ziel genauso, von seiner eigenen Position und seiner Reichweite aus.
Positionen
Der Abstand wird zwischen dem Punkt und der Position jeder Entität in der Welt gemessen: ihr x und y, über die Positionen, Drehungen und Skalierungen ihrer Eltern, dort, wo sie gezeichnet wird. Für Entitäten an der Wurzel oder unter einem Elternteil bei (0, 0), das sich nicht dreht oder skaliert (die Gegner eines Levels, wie üblich), sind das ihr x und y.
Eine früher im selben Frame geschriebene Position wird sofort gesehen: Bewege einen Schuss und frage dann, was in seiner Nähe ist.
Sonderfälle
- Ein negativer Radius findet nichts.
math.inffindet jede Entität, die nächste zuerst. - Das Ergebnis sagt, wo die Dinge waren, als gefragt wurde: Frage erneut, nachdem sie sich bewegt haben.