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):

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)