Es ist an der Zeit, den Kochlöffel beiseite zu legen, um die Hände für unser erstes echtes LSL-Script frei zu haben. Zwei Orte gibt es in einem SL-Viewer, an denen man ein neues Script anlegen kann:
Zu beachten ist, dass LSL-Scripte nur inworld laufen. Das bedeutet, sie müssen sich in einem Objekt befinden, damit sie ausgeführt werden können. Man kann Scripte zwischen Inventar und Objektinventar und umgekehrt durch Festhalten mit der linken Maustaste und anschließendes Ziehen an den Zielort problemlos hin- und herkopieren (Drag & Drop). Aus Sicherheitsgründen möchte ich Euch ans Herz legen, Scripte nicht nur in den jeweiligen Objekten zu speichern, sondern auch eine Sicherungskopie in einem Inventarverzeichnis anzulegen. Dabei Vergabe eines sinnvollen Namens nicht vergessen.
Haben wir auf die eine oder andere Art ein neues Script erzeugt, sehen wir zu unserer Freude im sich nun öffnenden Editorfenster keine leere Seite, sondern bereits einen ersten Code:
Ich habe mir erlaubt, Kommentare hinzuzufügen, um die Orientierung etwas zu erleichtern. Nach unserer ersten Lektion kommt uns nun schon einiges bekannt vor: Ein State, zwei Events und zweimal dieselbe Funktion.
Doch wo sind die globalen Variablen deklariert, die wir auch gerade kennengelernt haben?
Bisher noch nirgendwo. Natürlich kann man konkrete Werte, die man wie hier eigentlich nur einmal braucht, auch direkt in die
Funktionen schreiben (sofern sie das für die Funktion erwartete Datenformat haben). Zu Übungszwecken und um später bei einem
längeren Script komfortabler auf Variablen und ihre Werte zugreifen zu können, verlagern wir "Hello Avatar!" und "Touched."
kurzerhand einmal in zwei globale Variablen, nämlich
und
string
text1
. An die Stelle, wo die beiden Texte in der Funktion string
text2llSay
gestanden haben, tragen wir nur noch den Variablennamen ein, so dass die Funktionen nun so aussehen:
llSay
(0, text1);
llSay
(0, text2);
Nach dem Speichern posaunt unser Script nun beide Botschaften weiter in den öffentlichen Chat, denn neben der Textvariablen
enthält llSay
auch noch eine unauffällige, aber folgenschwere 0. Das ist die Kanalnummer des öffentlichen
Chats. Damit kann man aber irgendwann die Nachbarschaft nerven, speziell wenn man vielleicht auf diese Weise langsam aber sicher ein Script
beständig Werte oder Statusmeldungen ausgeben lässt. Deshalb gibt es auch eine lautlosere Schwesterfunktion, die sich in Eurem
weiteren Scripterleben als äußerst nützliches Hilfsmittel beim "Trockenwohnen" Eurer Programme erweisen wird:
llOwnerSay
(string
text);
Aufmerksamen Beobachtern wird sofort der Verlust der Kanalnummer aufgefallen sein. Wir brauchen sie für Botschaften an uns selbst einfach nicht - oder telefoniert Ihr etwa auch im RL mit Euch selbst?
Mit Hovertext sind schwebende Buchstaben über einem Prim gemeint, die vielerorts in SL zu sehen sind und sich leicht erzeugen lassen. Die hierfür benötigte Funktion heißt
llSetText
(string
text, vector
color, float
alpha);
Im Klartext heißt dies, dass diese Funktion neben dem darzustellenden Text auch eine Farbe in Form einer Vector-Variable und einen Transparenzwert als Float-Variable erwartet.
Wir bauen diese Funktion im touch_start
-Event ein und ersetzen den Platzhalter für den Text schon
einmal gegen text2
. Fehlen noch die Farbe und der Transparenzwert. Beides deklarieren wir ebenfalls als globale
Variable - nicht, weil es nun hier im konkreten Falle unbedingt nötig wäre, sondern aus Übungsgründen. Unter unsere beiden
Textvariablen ergänzen wir nun also:
vector
red = <1.0,0.0,0.0>;
float
alpha = 1.0;
Bitte jeweils nicht das Semikolon vergessen! Die Funktion im Script selbst sollte nun so geschrieben sein:
llSetText
(text2, red, alpha);
Dass hier für die Farbinformation ein vector
verwendet wird, hat nichts mit dem aus der Geometrie bekannten xyz-Vektor zu
tun. Wir bedienen uns einfach dieses für drei Fließkommazahlen vorgesehenen Datentyps, um die Werte für rot, grün und blau
zusammen transportieren zu können. Letztere beiden sind 0.0, weil wir ein reines ungemischtes Rot haben möchten. Die
Minimalwerte sind übrigens immer 0.0 und die Maximalwerte 1.0. Das hängt damit zusammen, dass die möglichen 256 RGB-Farbwerte
von 0-255 in LSL als Dezimalzahl nach der Formel x/255 angegeben werden. Selbiges gilt für den Transparenzwert, der von 0.0
(transparent = voll durchsichtig) bis 1.0 (opak = voll undurchsichtig) reicht.
Euer Script sollte jetzt so aussehen:
Speichern wir nun das Script und berühren das Objekt danach, erscheint in roten Lettern "Touched." über unserem Prim. Klicken wir erneut, bleibt es auch dabei. Das ist zugegebenermaßen nicht gerade sehr aufregend.
OK, netter Versuch, aber so ein Script wollen wir nicht. Wir machen uns zwar eine Sicherungskopie ins Inventar, aber dann entscheiden wir uns, es wieder aus dem Objekt-Invantar zu löschen.
Doch was ist das? Die Schrift bleibt einfach stehen! Was ist denn da schiefgelaufen? Sofort denken wir an Goethes "Zauberlehrling": "Die ich rief, die Geister, / Werd’ ich nun nicht los."
Keine Sorge, es ist alles in Ordnung! Es gibt eine Reihe von Funktionen in LSL, die ihre Wirkung nur auf unseren Rechnern zuhause entfalten. Dazu gehört besagter Hovertext, aber auch Partikel, animierte Texturen, bestimmte Arten von Rotationen - kurzum: Alles, was nur bei uns clientseitig ausgeführt wird und nicht auf dem SL-Server der Sim, auf der wir uns gerade befinden. Ihre Funktion geht als Eigenschaft auf das Objekt über. Diese überraschende Eigenschaft kann sogar von Vorteil sein, denn wenn etwas ohne Script weiterläuft, kann man eben dieses Script guten Gewissens einsparen - und damit Lag verhindern!
Möchten wir den Hovertext wieder loswerden, brauchen wir aber wieder ein Script. Statt eines Textes fügen wir einfach eine Leerstelle "" in die Funktion llSetText ein. Wenn wir möchten, können wir das Script nun auch wieder entfernen. Sinngemäß würde man auch mit anderen clientseitigen Funktionen verfahren, doch davon ein andernmal.
Wir möchten aber mehr lernen, ziehen unsere Sicherungskopie wieder zurück in den Prim und machen uns Gedanken, wie man für etwas mehr Abwechslung sorgen kann. Beispielsweise mit einem Wechselschalter!