Objekte mit Scripten programmieren ed
Variablen-Typ ist Model.
Im Editor kann einem Modell eine Script-Datei zugeordnet werden. Wird in dieser Datei eine neue Klasse definiert, die von Model abgeleitet ist, so wird das entsprechende Modell als eine Instanz dieser Klasse erschaffen.
Callback Funktionen ed
Das Verhalten eines Objektes kann durch das Überschreiben spezieller Funktionen definiert werden, die von der Engine automatisch zu bestimmten Zeitpunkten ausgeführt werden (Callback-Funktionen):
- void Model.on_init() (einmalig beim Laden des Objekts)
- void Model.on_delete() (einmalig beim Entfernen des Objektes)
- void Model.on_iterate() (regelmäßig in jedem Frame des Spieles)
- void Model.on_collide(Model *p) (bei einer Kollision mit einem anderen Objekt p)
- void Model.on_collide(Terrain *p) (bei einer Kollision mit einem Terrain p)
Die Funktion void Model.on_delete() hat den Sinn eines "Destructors". Hierin können zum Beispiel für das Objekt geladene Partikel, Sounds, etc. gelöscht werden.
Variablen ed
Zu beachten ist, dass das Script nur ein einziges Mal existiert! Mehrere Objekte können sich das Script teilen, weshalb globale Variablen auch von all diesen Objekten geteilt werden.
Im Array Model.var[] stehen Werte, die dem Modell im Editor zugeordnet wurden. Sie können auch in Scripten verändert werden und werden übers Netzwerk synchronisiert.
Um dem Modell weitere Variablen (auch anderen Typs) zuzuordnen, können beim Definieren der Klasse einfach weitere Elemente hinzugefügt werden.
sonstiges ed
Alle Objekte in der 3d-Welt sind in der Liste Model enthalten. Der Index ist für jedes Objekt fest, weswegen die Liste nach dem Löschen von Objekten Lücken enthalten kann.
Beispiele ed
Beispiel:
# per Makro einen Alias-Namen fuer die Objekt-Variable Nr 13 festlegen
#define _test var[13]
class MyModel extends Model
# zusätzliche Elemente
string stupid_string
override void on_init()
name = "Heinz" # Name in Heinz ändern
_test = 4.1
# solange das Objekt existiert seine Geschwindigkeit festhalten
override void on_iterate(float dt)
vel = vector(100, 0, 0)
Beispiel: (komplizierter)
class MyModel extends Model
float time_run
float min_distance
override void on_init()
time_run = 0
min_distance = 200.0
# das Ego-Objekt verfolgen
override void on_iterate(float dt)
# in welcher Richtung ist Ego?
vector dpos = ego.pos - pos
float ang_y = atan2(dpos.z, dpos.x)
float distance = dpos.length()
# in Ego-Richtung ausrichten
ang = quaternion.rotation_v(vector(0, ang_y, 0))
# auf ego zulaufen
vector dir = dpos.normalized()
if distance > min_distance
vel = dir * 100.0
else
vel = v0
# Animation
reset_animation()
if distance > min_distance
# vielleicht eine Lauf-Animation...
animate(MoveOpSet, 0, 0, 13, time_run, Engine.elapsed, 0, true)