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.onDelete() 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 Object[] 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 : Model
    // zusätzliche Elemente
    string stupid_string

    overwrite void onInit()
        name = "Heinz" // Name in Heinz ändern
        _test = 4.1

    // solange das Objekt existiert seine Geschwindigkeit festhalten
    overwrite void onIterate()
        vel = vector(100, 0, 0)

Beispiel: (komplizierter)

class MyModel : Model
    float time_run
    float min_distance

    overwrite void onInit()
        time_run = 0
        min_distance = 200.0

    // das Ego-Objekt verfolgen
    overwrite void onIterate()

        // 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
        QuaternionRotationV(ang, vector(0, ang_y, 0))

        // auf Ego zulaufen
        vector dir = dpos
        dir.normalize()
        if distance > min_distance
            vel = dir * 100.0
        else
            vel = v0

        // Animation
        resetAnimation()
        if distance > min_distance
            // vielleicht eine Lauf-Animation...
            animate(MoveOpSet, 0, 0, 13, time_run, Engine.elapsed, 0, true)