Von "Hello Avatar!" zum Hovertext

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:

  1. In unserem Inventar, z.B. durch Aufruf des Kontextmenüs mit der rechten Maustaste und die Option Neues Skript (New Script), oder
  2. im Objektinventar eines Prims, erreichbar über die letzte Registerkarte Inhalt (Content) im Baumenü, durch Drücken der Taste Neues Skript.

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.

Das erste Script

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:

Hello Avatar!

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 string text1 und string text2. An die Stelle, wo die beiden Texte in der Funktion llSay 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?

Hovertext

Hovertext

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:

Globale Variablen und Hovertext

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!

© 2012 ff. Almut Brunswick. Nur für den persönlichen Gebrauch! Aus rechtlichen Gründen distanziere ich mich von allen externen Links.