Objekte mit Scripten programmieren ed
Variablen-Typ ist object.
Die komplette Script-Datei wird für jedes Objekt einzeln neu erzeugt! Objekte gleichen Typs haben somit unabhängige (globale) Variablen, aber die gleichen Funktionen. Das erzeugende Objekt kann immer über this angesprochen werden.
Sobald das Objekt geladen wird, wird auch angefangen, seine void main() auszuführen. Durch eine while-Schleife kann ein dauerhaftes Verhalten programmiert werden, es muss aber unbedingt ein wait()-Befehl eingebaut sein!!! Wird das Objekt gelöscht, so wird auch das Script beendet, sobald es einen wait-Befehl erreicht.
Bevor das Objekt gelöscht wird, wird die Funktion void KillObject() in dessen Script ausgeführt ("Destructor"). Hierin können zum Beispiel für das Objekt geladene Partikel, Sounds, etc. gelöscht werden.
Alle Objekte in der 3d-Welt sind im Array Object[] enthalten, die Menge wird durch NumObjects angegeben. Der Index ist für jedes Objekt fest, weswegen der Array 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 ScriptVar[13]
void main()
{
this.Name = "Heinz"; // Name in Heinz aendern
this.Test = 4.1f;
while (true){
// solange das Objekt existiert seine Geschwindigkeit festhalten
this.Vel = vector(100, 0, 0);
// einen Frame warten
wait_of();
}
}Beispiel: (komplizierter)
void main()
{
float time_run = 0;
float min_distance = 200.0f;
// das ego-Objekt verfolgen
while (true){
// 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;
VecNormalize(dir, dpos);
if (distance > min_distance)
this.Vel = dir * 100.0f;
else
this.Vel = v0;
// Animation
ModelMoveReset(this.model);
if (distance > min_distance)
// vielleicht eine Lauf-Animation...
ModelMoveSet(this.model, MoveOpSet, 0, 0, 13, time_run, elapsed, 0, true);
wait_of();
}
}