Objekte mit Scripten programmieren ed
Variablen-Typ ist model.
Das Verhalten eines Objektes kann durch spezielle Funktionen definiert werden, die von der Engine automatisch zu bestimmten Zeitpunkten ausgeführt werden (Callback-Funktionen):
- void OnInitObject(model this) (einmalig beim Laden des Objekts)
- void OnKillObject(model this) (einmalig beim Entfernen des Objektes)
- void OnIterateObject(model this) (regelmäßig in jedem Frame des Spieles)
- void OnCollideObject(model this, model p) (bei einer Kollision mit einem anderen Objekt p)
- void OnCollideTerrain(model this, terrain p) (bei einer Kollision mit einem Terrain p)
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.
Die Funktion void OnKillObject(model this) hat den Sinn eines "Destructors". Hierin können zum Beispiel für das Objekt geladene Partikel, Sounds, etc. gelöscht werden.
Alle Objekte in der 3d-Welt sind in der Liste Object[] enthalten. Der Index ist für jedes Objekt fest, weswegen die Liste nach dem Löschen von Objekten Lücken enthalten kann.
Beispiel:
// per Makro einen Alias-Namen fuer die Objekt-Variable Nr 13 festlegen
#define Test Var[13]
void OnInitObject(model this)
this.Name = "Heinz" // Name in Heinz aendern
this.Test = 4.1
// solange das Objekt existiert seine Geschwindigkeit festhalten
void OnIterateObject(model this)
this.Vel = vector(100, 0, 0)Beispiel: (komplizierter)
void OnInitObject(model this)
float time_run = 0
float min_distance = 200.0
// das ego-Objekt verfolgen
void OnIterateObject(model this)
// in welcher Richtung ist ego?
vector dpos = ego.Pos - this.Pos
float ang_y = atan2(dpos.z, dpos.x)
float distance = VecLength(dpos)
// in ego-Richtung ausrichten
this.Ang = vector(0, ang_y, 0)
// auf ego zulaufen
vector dir = dpos
VecNormalize(dir)
if distance > min_distance
this.Vel = dir * 100.0
else
this.Vel = v0
// Animation
this.Model.ResetMove()
if distance > min_distance
// vielleicht eine Lauf-Animation...
this.Model.Move(MoveOpSet, 0, 0, 13, time_run, elapsed, 0, true)