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.onInit(model this) (einmalig beim Laden des Objekts)
- void Model.onDelete(model this) (einmalig beim Entfernen des Objektes)
- void Model.onIterate(model this) (regelmäßig in jedem Frame des Spieles)
- void Model.onCollide(Model *p) (bei einer Kollision mit einem anderen Objekt p)
- void Model.onCollide(Terrain *p) (bei einer Kollision mit einem Terrain p)
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)