Hier lernt ihr das sinnvolle benutzen von #include und #appendto
#includeDurch den Befehl #include wird das Script des Objekts der ID die dahinter steht an dieser Stelle angefügt (es sollte oben im Script geschrieben werden)
Beispiel: - Zitat :
- ID: OBJ1
Script:
#strict
func Funktion() { Message("Hallo",this());}
- Zitat :
- ID: OBJ2
Script:
#strict
#include OBJ1
func Funktion(){Message("Welt",this());}
Da das Script an der Stelle angefügt wurde bei dem Include steht sieht das ganze jetzt imaginär so aus:
- Zitat :
- ID: OBJ2
Script:
#strict
#include OBJ1
func Funktion() { Message("Hallo",this());}
func Funktion(){Message("Welt",this());}
Hier ist jetzt zweimal die selbe Funktion in einem Script (Es können auch neue Funktionen Includiert werden!), wodurch ein kleines Problem entsteht:
Welche soll genutzt werden? Diejenige die am weitesten unten steht wird gewertet, weswegen die nachricht "Welt" ausgibt.
Das ist nützlich wenn man ein Objekt hat, es aber nur in den Grundzügen ändern will und ansonsten übernehmen kann wie z.B. beim schaffen eines Alternativen Clonks. Dort reicht es meist den Standard Clonk als Grundlage zu nutzen.
Hiermal ein Beispiel für einen Kamikaze Clonk mit voller funktionsfähigkeit, bis darauf das er sich auf "Werfen" in die Luft sprengt, solange er nichts in der hand hält.
- Zitat :
- ID: KACL
Script:
#strict
#include CLNK
func ControlThrow()
{
Kill()
this()->Explode(50);
return(1);
}
Kommen wir mal zu inherited(), was dazu führt das die im Script nächst höhere Funktion (Die überaldene Funktion) ausgeführt wird und der rückgabe wert ihrer zurück gegeben wird. Ein Simples Beispiel demonstriert das mal:
- Zitat :
Script:
#strict
func Funktion(){Log("A"); _inherited();}
func Funktion(){Log("B"); _inherited();}
func Funktion(){Log("C"); _inherited();}
func Funktion(){Log("D"); _inherited();}
func Funktion(){Log("E"); _inherited();}
func Funktion(){Log("F"); _inherited();}
resultierende Ausgabe: FEDCBA
Das Funktioniert natürlich auch bei dem Hallo/Welt beispiel weiter oben. Sollte keine Funktion "oben drüber" gefunden werden wird garnichts gemacht. Will man eine fehlermeldung kann man inherited() statt _inherited() benutzen.
Übrigens: Wenn man auchnoch alle Parameter übergeben will, aber zu faul ist diese abzutippen/sie unbekannt sind kann man auch _inherited(...) schreiben.
Multiple Includierungen sind natürlich auch möglich:
- Zitat :
- #include OBJ1
#include OBJ2
#appendtoDurch den Befehl #appendto wird das Script in der das jeweilige #appendto steht unten an das Script mit der darauffolgenden ID angehängt. Auch appendto sollte immer vor der ersten Script zeile geschrieben werden (aber nach #strict!)
Aus dem
- Zitat :
- ID: OBJ1
Script:
#strict
func Funktion(){Message("Hallo",this());}
und dem
- Zitat :
- ID: OBJ2
Script:
#strict
#appendto OBJ1
func Funktion(){Message("Welt",this());}
können wir uns vorstellen das das hier wird
- Zitat :
- ID: OBJ1
Script:
#strict
func Funktion(){Message("Hallo",this());}
func Funktion(){Message("Welt",this());}
Wobei wieder die unterste Funktion gewertet wird (Welt wird ausgegeben)
#appendto sind besonders nützlich wenn man vorhandene Clonks um kleine Script funktionen erweitern will.
Man kann sie genauso wie #include mehrfach benutzen. Es besteht jedoch noch die möglichkeit sie an alle Objekte anzuhängen:
- Zitat :
- #appendto *
Mit einem Trick für Fortgeschrittene ist es auch möglich sie nur an bestimmte typen von objekten anzuhängen, aber trotzdem keine genaueren zu definieren. Z.b. könnte man alle Clonks durch Werfen sprengen, da es allerdings nahezu unendlich viele (von ritterclonk bis hazardclonk oder superdupermegadoofimbaclonk von wuargh301) gibt ist es soetwas eher ungeschickt:
- Zitat :
- Script:
#strict
#appendto CLNK
#appendto BLA1
#appendto BLA2
....
und an alle etwas anhöngen:
- Zitat :
- #appendto *
klappt genauso wenig.
Hier die lösung:
- Zitat :
- #strict
#appendto *
func Funktion()
{
if(!Bedingung()) return(_inherited(...)); //Muss bei jeder überladenen/benutzen Funktion sein
//Bedingung könnte zb. IsClonk() sein, was alle clonks beträfe
Script(); //beliebiges Script
}
Ich hoffe das half euch einigermaßen etwas recht simples zu verstehen.