ent_move (vector reldist, vector absdist);

Bewegt die my-Entity über eine bestimmte Entfernung und führt während der Bewegung eine Kollisionserkennung aus (s.Entity-Kapitel über Kollisionserkennung). Der erste Vektor, reldist, gibt eine relative Stecke und Richtung in gedrehten Entitykoordinaten d.h. in die Richtung, in welche die Entity schaut, an. Der zweite Vektor, absdist, gibt eine absolute Strecke und Richtung in Weltkoordinaten an. Die daraus resultierende Bewegung ist eine Kombination aus beiden Strecken. Üblicherweise wird der erste Vektor für die Antriebsgeschwindigkeit der Entity, und der zweite für äußere Kräfte, wie etwa Schwerkraft und Drift benutzt. Um einen dieser Vektoren auf Null zu setzen, kann der vordefinierte nullvector angegeben werden.

Ent_move liefert die zurückgelegte Entfernung zurück. Konnte die Entity sich überhaupt nicht bewegen, weil sie von Hindernissen gestoppt wird, wird ein negativer Wert oder 0 zurückgeliefert. Der vordefinierte MY_SPEED-Vektor wird auf die sich ergebende absolute zurückgelegte Strecke gesetzt. Ist die Entity mit etwas zusammengestoßen, wird der NORMAL-Vektor auf die Normale der kollidierenden Oberfläche gesetzt - also einen Vektor der Länge 1, der senkrecht auf der Oberfläche stehend von ihr weg zeigt. Dies kann zur Bestimmung der Richtung der Oberfläche benutzt werden. Ist zum Beispiel NORMAL.Z nahe 1, ist die Entity mit dem Boden zusammengestoßen. Ist NORMAL.Z nahe -1, ist sie mit der Decke zusammengestoßen, und bei NORMAL.Z nahe 0, ist sie auf eine vertikale Mauer getroffen. Die Oberfläche eines Sprites oder Modelle wird hier als vertikaler Zylinder angenommen. Der vorgegebene BOUNCE-Vektor ist auf die Richtung gesetzt, in welche die kollidierende Entity von der Oberfläche abprallen würde, und kann daher zum Einbinden eines Abprallverhaltens verwendet werden.

Parameter:

reldist Abstands-und Richtungsvektor in Entity-Koordinaten
absdist Abstands-und Richtungsvektor in Welt-Koordinaten
move_friction vordefinierte Variable, Reibung beim Gleiten entlang von Oberflächen, 0..1
move_mode vordefinierte Variable, Kollisionsmodus

Rückgabewert:

  
> 0 zurückgelegte Entfernung
<= 0 Entity konnte sich nicht bewegen

Modifiziert:

my_speed zurückgelegte Strecke und Richtung
normal Vektor der Normalen des getroffenen Polygons
bounce Abprallvektor des getroffenen Polygons
in_passable ist 1, wenn die Bewegung in einem passable Block endet
in_solid ist 1, wenn die Bewegung in einem nicht passable Block endet.
event_type wird auf den Event-Typus gesetzt

Bemerkungen:

Vor dem Ausführen von ent_move muss der Move-Modus durch die vordefinierte move_mode-Variable gesetzt werden. Die folgenden Modi können kombiniert werden:

IGNORE_YOU ignoriert die YOU Entity bei der Kollisionserkennung
IGNORE_PASSABLE ignoriert alle passable Blocks und Entities
IGNORE_PASSENTS ignoriert passable Modell- und Sprite-Entities
IGNORE_MAPS ignoriert alle Map Entities
IGNORE_MODELS ignoriert alle Modelle
IGNORE_SPRITES ignoriert alle Sprites
IGNORE_PUSH bewegt sich durch alle Entities mit kleinerem push Wert als my
ACTIVATE_TRIGGER aktiviert Trigger-Events während der Bewegung
GLIDE gleitet nach Auftreffen an Wänden und Entities entlang

Der ignore_passents-Modus kann noch passierbare Blocks und Map Entities erkennen - endete die Bewegung in einen passierbaren Block, wird die vordefinierte IN_PASSABLE -Variable auf 1 gesetzt. Führte die Bewegung in einen Block fester Materie (was nur dann passieren kann, wenn PASSABLE-Entities bewegt werden), wird die IN_SOLID -Variable auf 1 gesetzt.

Geschwindigkeit:

Langsam

Beispiel:

Das Ignorieren der YOU-Entity kann beispielsweise dazu eingesetzt werden, dass eine abgeschossene Kugel nicht gleich im Lauf oder innerhalb der sie abfeuernden Entity stecken bleibt. Das Kombinieren der Move-Modi erfolgt durch einfaches Addieren, z.B.

move_mode = IGNORE_YOU + IGNORE_PASSABLE + IGNORE_PUSH + ACTIVATE_TRIGGER + GLIDE;
result = ent_move(reldist,absdist);

Siehe auch:

move_friction, normal, bounce, in_passable, in_solid, event_type, you, c_move

► Aktuelle Version Online