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
Hierbei ist this jeweils das "eigene" Objekt.

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)