Difference between revisions of "FURWARE text/Tutorial/de"
Ochi Wolfe (talk | contribs) m |
Ochi Wolfe (talk | contribs) (Fixed syntax highlighting) |
||
Line 33: | Line 33: | ||
< | <source lang="lsl2"> | ||
link_message(integer sender, integer num, string str, key id) { | link_message(integer sender, integer num, string str, key id) { | ||
if (id == "fw_ready") { | if (id == "fw_ready") { | ||
Line 45: | Line 45: | ||
} | } | ||
} | } | ||
</ | </source> | ||
Line 55: | Line 55: | ||
< | <source lang="lsl2"> | ||
default { | default { | ||
state_entry() { | state_entry() { | ||
Line 71: | Line 71: | ||
} | } | ||
} | } | ||
</ | </source> | ||
Line 91: | Line 91: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "This is some example text", "fw_data"); | llMessageLinked(LINK_SET, 0, "This is some example text", "fw_data"); | ||
</ | </source> | ||
Line 105: | Line 105: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "c=blue; a=center", "fw_conf"); | llMessageLinked(LINK_SET, 0, "c=blue; a=center", "fw_conf"); | ||
</ | </source> | ||
Line 133: | Line 133: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "This is some example text", "fw_data"); | llMessageLinked(LINK_SET, 0, "This is some example text", "fw_data"); | ||
llMessageLinked(LINK_SET, 0, "c=blue; a=center", "fw_conf"); | llMessageLinked(LINK_SET, 0, "c=blue; a=center", "fw_conf"); | ||
</ | </source> | ||
Line 148: | Line 148: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "Only for set Beta", "fw_data : Beta"); | llMessageLinked(LINK_SET, 0, "Only for set Beta", "fw_data : Beta"); | ||
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Beta"); | llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Beta"); | ||
</ | </source> | ||
Line 186: | Line 186: | ||
< | <source lang="lsl2"> | ||
// Add the boxes. | // Add the boxes. | ||
llMessageLinked(LINK_SET, 0, "", "fw_addbox : ButtonOK : Dialog : 1, 2, 10, 1"); | llMessageLinked(LINK_SET, 0, "", "fw_addbox : ButtonOK : Dialog : 1, 2, 10, 1"); | ||
Line 213: | Line 213: | ||
llMessageLinked(LINK_SET, 0, "1.2\n2.3\n3.4", "fw_data : Column2"); | llMessageLinked(LINK_SET, 0, "1.2\n2.3\n3.4", "fw_data : Column2"); | ||
llMessageLinked(LINK_SET, 0, "▲\n\n▼", "fw_data : UpDown"); | llMessageLinked(LINK_SET, 0, "▲\n\n▼", "fw_data : UpDown"); | ||
</ | </source> | ||
Line 235: | Line 235: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "OK", "fw_addbox : ButtonOK : Dialog : 1, 2, 10, 1 : a=center"); | llMessageLinked(LINK_SET, 0, "OK", "fw_addbox : ButtonOK : Dialog : 1, 2, 10, 1 : a=center"); | ||
llMessageLinked(LINK_SET, 0, "Cancel", "fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center"); | llMessageLinked(LINK_SET, 0, "Cancel", "fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center"); | ||
Line 245: | Line 245: | ||
llMessageLinked(LINK_SET, 0, "Some dialog", "fw_data : Dialog"); | llMessageLinked(LINK_SET, 0, "Some dialog", "fw_data : Dialog"); | ||
</ | </source> | ||
Line 253: | Line 253: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "OK", "fw_addbox : ButtonOK : Dialog : 1, 2, 10, 1 : a=center; border=lr"); | llMessageLinked(LINK_SET, 0, "OK", "fw_addbox : ButtonOK : Dialog : 1, 2, 10, 1 : a=center; border=lr"); | ||
llMessageLinked(LINK_SET, 0, "Cancel", "fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center; border=lr"); | llMessageLinked(LINK_SET, 0, "Cancel", "fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center; border=lr"); | ||
Line 264: | Line 264: | ||
llMessageLinked(LINK_SET, 0, "Some dialog", "fw_data : Dialog"); | llMessageLinked(LINK_SET, 0, "Some dialog", "fw_data : Dialog"); | ||
llMessageLinked(LINK_SET, 0, "border=lrtb", "fw_conf : Dialog"); | llMessageLinked(LINK_SET, 0, "border=lrtb", "fw_conf : Dialog"); | ||
</ | </source> | ||
Line 290: | Line 290: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "", "fw_delbox : ButtonOK"); | llMessageLinked(LINK_SET, 0, "", "fw_delbox : ButtonOK"); | ||
llMessageLinked(LINK_SET, 0, "", "fw_delbox : ButtonCancel"); | llMessageLinked(LINK_SET, 0, "", "fw_delbox : ButtonCancel"); | ||
</ | </source> | ||
Line 299: | Line 299: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "", "fw_delbox : ButtonOK : ButtonCancel"); | llMessageLinked(LINK_SET, 0, "", "fw_delbox : ButtonOK : ButtonCancel"); | ||
</ | </source> | ||
Line 318: | Line 318: | ||
< | <source lang="lsl2"> | ||
touch_start(integer numDetected) { | touch_start(integer numDetected) { | ||
string link = (string)llDetectedLinkNumber(0); | string link = (string)llDetectedLinkNumber(0); | ||
Line 324: | Line 324: | ||
llMessageLinked(LINK_SET, 0, "Some user data", "fw_touchquery:" + link + ":" + face); | llMessageLinked(LINK_SET, 0, "Some user data", "fw_touchquery:" + link + ":" + face); | ||
} | } | ||
</ | </source> | ||
Line 358: | Line 358: | ||
< | <source lang="lsl2"> | ||
link_message(integer sender, integer num, string str, key id) { | link_message(integer sender, integer num, string str, key id) { | ||
if (id == "fw_touchreply") { | if (id == "fw_touchreply") { | ||
Line 384: | Line 384: | ||
} | } | ||
} | } | ||
</ | </source> | ||
Line 392: | Line 392: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a", "fw_conf : ButtonOK"); | llMessageLinked(LINK_SET, 0, "border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a", "fw_conf : ButtonOK"); | ||
llMessageLinked(LINK_SET, 0, "border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a", "fw_conf : ButtonCancel"); | llMessageLinked(LINK_SET, 0, "border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a", "fw_conf : ButtonCancel"); | ||
</ | </source> | ||
Line 403: | Line 403: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a", "fw_var : button"); | llMessageLinked(LINK_SET, 0, "border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a", "fw_var : button"); | ||
</ | </source> | ||
Line 411: | Line 411: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "style=button", "fw_conf : ButtonOK"); | llMessageLinked(LINK_SET, 0, "style=button", "fw_conf : ButtonOK"); | ||
llMessageLinked(LINK_SET, 0, "style=button", "fw_conf : ButtonCancel"); | llMessageLinked(LINK_SET, 0, "style=button", "fw_conf : ButtonCancel"); | ||
</ | </source> | ||
Line 426: | Line 426: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "style=button; c=darkred", "fw_conf : ButtonCancel"); | llMessageLinked(LINK_SET, 0, "style=button; c=darkred", "fw_conf : ButtonCancel"); | ||
</ | </source> | ||
Line 454: | Line 454: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell3"); | llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell3"); | ||
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell4"); | llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell4"); | ||
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell5"); | llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell5"); | ||
</ | </source> | ||
Line 464: | Line 464: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell3 : Cell4 : Cell5"); | llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell3 : Cell4 : Cell5"); | ||
</ | </source> | ||
Line 472: | Line 472: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell3 ; Cell5"); | llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell3 ; Cell5"); | ||
</ | </source> | ||
Line 486: | Line 486: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "", "fw_conf : Cell0 ; Cell8"); | llMessageLinked(LINK_SET, 0, "", "fw_conf : Cell0 ; Cell8"); | ||
llMessageLinked(LINK_SET, 0, "?", "fw_data : Cell0 ; Cell8"); | llMessageLinked(LINK_SET, 0, "?", "fw_data : Cell0 ; Cell8"); | ||
</ | </source> | ||
Line 495: | Line 495: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "", "fw_conf : Cell0 ;"); | llMessageLinked(LINK_SET, 0, "", "fw_conf : Cell0 ;"); | ||
llMessageLinked(LINK_SET, 0, "?", "fw_data : Cell0 ;"); | llMessageLinked(LINK_SET, 0, "?", "fw_data : Cell0 ;"); | ||
</ | </source> | ||
Line 506: | Line 506: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "!", "fw_data : Cell1;Cell3 : Cell5 : Cell7; "); | llMessageLinked(LINK_SET, 0, "!", "fw_data : Cell1;Cell3 : Cell5 : Cell7; "); | ||
</ | </source> | ||
Line 531: | Line 531: | ||
< | <source lang="lsl2"> | ||
// Setzt die Voreinstellung für alle Boxen auf rot, zentriert. | // Setzt die Voreinstellung für alle Boxen auf rot, zentriert. | ||
llMessageLinked(LINK_SET, 0, "c=red; a=center", "fw_defaultconf"); | llMessageLinked(LINK_SET, 0, "c=red; a=center", "fw_defaultconf"); | ||
Line 540: | Line 540: | ||
// Setzt die Voreinstellung für alle NICHT-ROOT-Boxen auf "kein Trimming". | // Setzt die Voreinstellung für alle NICHT-ROOT-Boxen auf "kein Trimming". | ||
llMessageLinked(LINK_SET, 0, "t=off", "fw_defaultconf : nonroot"); | llMessageLinked(LINK_SET, 0, "t=off", "fw_defaultconf : nonroot"); | ||
</ | </source> | ||
Line 550: | Line 550: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "<!a=center>Some <!c=rand; f=5054fec3-1465-af8f-2fe5-e9507795c82a>fancy<!c=def> dialog", "fw_data : Dialog"); | llMessageLinked(LINK_SET, 0, "<!a=center>Some <!c=rand; f=5054fec3-1465-af8f-2fe5-e9507795c82a>fancy<!c=def> dialog", "fw_data : Dialog"); | ||
</ | </source> | ||
Line 580: | Line 580: | ||
< | <source lang="lsl2"> | ||
llMessageLinked(LINK_SET, 0, "border=tblr; tags=off", "fw_conf : Dialog"); | llMessageLinked(LINK_SET, 0, "border=tblr; tags=off", "fw_conf : Dialog"); | ||
</ | </source> | ||
Du kannst diese Einstellung sogar "inline" verwenden, aber nur am Anfang von Zeilen (genauso wie bei Ausrichtung usw.). Dann werden Angaben für den Rest der Zeile und '''alle''' weiteren Zeilen ignoriert (es gibt dann ja keine Möglichkeit mehr, die Stilangaben innerhalb der Zeile wieder zu aktivieren). | Du kannst diese Einstellung sogar "inline" verwenden, aber nur am Anfang von Zeilen (genauso wie bei Ausrichtung usw.). Dann werden Angaben für den Rest der Zeile und '''alle''' weiteren Zeilen ignoriert (es gibt dann ja keine Möglichkeit mehr, die Stilangaben innerhalb der Zeile wieder zu aktivieren). |
Latest revision as of 00:41, 8 April 2015
Erste Schritte
Displays erstellen
Du kannst (und solltest) den mitgelieferten "FURWARE display creator" verwenden um automatisch perfekt ausgerichtete Display Prims zu erstellen. Jedes Prim erhält automatisch einen speziellen Objektnamen der vom Textskript verwendet wird um die korrekte Reihenfolge unabhängig von der Link-Reihenfolge feststellen zu können.
Ein Display zu erstellen ist einfach:
- Stelle den Display Creator auf ein Landstück, auf dem du hinreichende Rechte hast.
- Klicke das Creator-Objekt. In dem erscheindenden Dialog kannst du die Parameter des neuen Displays einstellen:
- Einen Namen für das Display. Dieser wird dazu verwendet um festzulegen, welches Display du ansprechen möchtest wenn du mehrere davon in einem Linkset verwendest.
- Die Anzahl der Zeilen und Spalten des Displays (die Spalten werden hier in Prims gezählt, nicht in Zeichen).
- Die Anzahl von Faces (Flächen, entspricht hier der Anzahl von Zeichen) pro Prim. Es stehen Prims mit 1 bis 8 Faces zur Verfügung. Im Allgemeinen ist es effizienter, mehr Faces pro Prim zu verwenden.
- Wenn du mit den Einstellungen zufrieden bist, klicke "Create" um die Prims zu erstellen. Anschließend kannst du sie geeignet an das Objekt linken auf dem du das Display verwenden möchtest.
Einrichtung und Initialisierung
Wenn du dein(e) Display(s) erstellt und verlinkt hast, lege eine Kopie des FURWARE text-Skripts in das Linkset. Es ist nur ein einziges Skript nötig um mehrere Displays im Linkset anzusteuern. Das Skript muss nicht im Root-Prim liegen.
Wichtiger Hinweis:
Wahrscheinlich möchtest du dem Textskript einige Befehle senden nachdem es sich selbst initialisiert hat. Ein Reset kann in ein paar Fällen auftreten:
- Das Skript wurde neu in das Objekt hineingelegt.
- Das Objekt, in dem sich das Skript befindet, wurde durch Shift-Drag kopiert.
- Das Linkset hat sich geändert (dann muss das Skript neu nach Display Prims suchen).
- Es wurde manuell zurückgesetzt (etwa per "fw_reset"-Befehl).
Um genau zu wissen wann das Skript bereit ist Befehle zu empfangen, sendet es nach der Initialisierung eine Link Message an das gesamte Linkset, in der der "id"-Parameter auf "fw_ready" gesetzt ist. Es wird dringend empfohlen nach diesen Link Messages zu lauschen und die eigenen Befehle zur Einrichtung des Textskript erst dann zu senden. Dein Code könnte in etwa so aussehen:
link_message(integer sender, integer num, string str, key id) {
if (id == "fw_ready") {
llOwnerSay("FW text is up and running!");
// Sende die ersten Kommandos.
llMessageLinked(sender, 0, "c=red", "fw_conf");
llMessageLinked(sender, 0, "Default text", "fw_data");
// ...
}
}
Tutorial
Vorbereitungen
Als erstes werden wir einen Rahmen schaffen mit welchem du die Beispiele in diesem Tutorial ausprobieren kannst. Es ist für den Anfang wahrscheinlich praktisch wenn sich das Textskript nach einer Änderung an deinem eigenen Skript zurücksetzt, sodass sich Einstellungen aus vorigen Experimenten nicht in die Quere kommen. Du kannst folgendes Skript als Ausgangspunkt verwenden:
default {
state_entry() {
// Setze das FURWARE text-Skript zurück.
llMessageLinked(LINK_SET, 0, "", "fw_reset");
}
link_message(integer sender, integer num, string str, key id) {
// Das Textskript sendet "fw_ready" wenn es sich initialisiert hat.
if (id == "fw_ready") {
// Hier kannst du deine Kommandos ausprobieren.
}
}
}
Tipp: In diesem Tutorial wird der Einfachheit halber immer an LINK_SET gesendet. Du kannst in deinen Objekten natürlich spezifischere/optimierte Angaben zum Empfänger verwenden. |
Wichtig: Es ist im Allgemeinen kein guter Stil das Skript jedes Mal zurückzusetzen wenn du irgendwas am Text verändern möchtest. Sobald du dich mit den Konzepten von FURWARE text vertraut gemacht hast wirst du sehen, dass man so gut wie alles machen kann ohne das Skript resetten zu müssen. Es ist lediglich praktischer für die ersten Experimente. |
Einzelnes Display-Set
Schauen wir uns zunächst den einfachsten Fall an. Als konkretes Beispiel verwenden wir ein Display bestehend aus 3x4 Prims mit jeweils 8 Faces. Hier eine schematische Darstellung unseres Displays:
Zunächst die zwei wichtigsten Befehle von FURWARE text: "fw_data" zum Setzen von Text und "fw_conf" zum Einstellen des Textstils (Farbe, Ausrichtung, Schriftart usw.). Der Text wird folgendermaßen gesetzt:
llMessageLinked(LINK_SET, 0, "This is some example text", "fw_data");
Dies ergibt:
Auf ähnliche Weise können wir die Textfarbe (color) auf blau und die Ausrichtung (alignment) auf zentriert setzen:
llMessageLinked(LINK_SET, 0, "c=blue; a=center", "fw_conf");
Kombiniert mit dem vorherigen "fw_data"-Befehl ergibt dies dann:
Tipp: Du musst nicht jedes mal sowohl den Text als auch den Stil setzen wenn du eines von beidem ändern möchtest. Wenn du den Stil einstellst wird der gerade gesetzte Text wiederverwendet und mit dem neuen Stil dargestellt. Ebenso wird der aktuelle Stil verwendet wenn du neuen Text einstellst. |
Mehrere Display-Sets
Ein einzelnes FURWARE text-Skript kann mehrere Display Sets in einem Linkset ansteuern. Das folgende Beispiel besteht aus drei Sets mit den Namen "Alpha", "Beta" und "Gamma":
Tipp: Die Prims der einzelnen Sets müssen nicht denselben Prim-Typ haben (also Faces pro Prim). Allerdings müssen innerhalb eines Sets die Prim-Typen identisch und die Anzahl der Spalten in allen Zeilen gleich sein. |
Wenn wir nun dieselben zwei Code-Zeilen wie im Fall des einzelnen Sets verwenden, werden alle Sets dieselben Einstellungen verwenden. Somit ergibt der Code
llMessageLinked(LINK_SET, 0, "This is some example text", "fw_data");
llMessageLinked(LINK_SET, 0, "c=blue; a=center", "fw_conf");
folgendes:
Nun stellt sich natürlich die Frage wie man die Sets einzeln anspricht. An dieser Stelle kommen die Namen ins Spiel, die wir bei der Display-Erstellung vergeben haben. Der letzte Parameter des llMessageLinked()-Befehls muss abgeändert werden. Um beispielsweise den Text und Stil von Set "Beta" zu ändern ergänzen wir "fw_data" und "fw_conf" jetzt um eine Angabe des Namens des Sets in der Form "fw_data : Beta" und "fw_conf : Beta":
llMessageLinked(LINK_SET, 0, "Only for set Beta", "fw_data : Beta");
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Beta");
Wenn wir dies wieder mit dem vorherigen Code verbinden, dann erhalten wir:
Virtuelle Textboxen
Zusätzlich zur Verwendung von mehreren Sets können wir auch virtuelle Textboxen innerhalb eines Sets erstellen. Diese können dazu verwendet werden um auf einfache Weise Text zu positionieren, beispielsweise um Tabellen, Dialoge und mehr zu realisieren.
Im folgenden Beispiel haben wir zwei Sets "Dialog" und "Table". Das Set "Dialog" wollen wir als einen einfachen Dialog mit zwei Knöpfen verwenden und das Set "Table" als eine Tabelle mit drei Zeilen, drei Spalten und noch eine zusätzliche Spalte für "up"- und "down"-Knöpfe.
Die kleine Überlappung (Overlap) zwischen den Spalten der Tabelle wird später nützlich sein wenn wir Rahmen zu den Boxen hinzufügen.
Die erste Aufgabe ist das Hinzufügen der Textboxen. Dies wird mit dem "fw_addbox"-Kommando erledigt. Die Syntax ist wie folgt:
fw_addbox : boxName : parentName : dx, dy, sx, sy : stylePrefs
Die einzelnen Parameter haben folgende Bedeutung:
- boxName: Ein beliebiger Name für die Box. Muss eindeutig unter allen Box- und Set-Namen sein.
- parentName: Der Name eines Sets oder einer Box zu dem oder der diese Box relativ positioniert werden soll.
- dx, dy, sx, sy: Vier Ganzzahlen, die die Position der neuen Box relativ zum Parent (dx, dy) und die Größe der neuen Box (sx, sy) angeben.
- stylePrefs: Die Angabe des Schriftstils (z.B. "c=red; a=center") den die neue Box standardmäßig verwenden soll; kann weggelassen werden.
Schreiben wir den Code zum Hinzufügen der Boxen auf. Wir werden dies zunächst ziemlich ausführlich machen und später eine kürzere Version anschauen.
// Add the boxes.
llMessageLinked(LINK_SET, 0, "", "fw_addbox : ButtonOK : Dialog : 1, 2, 10, 1");
llMessageLinked(LINK_SET, 0, "", "fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1");
llMessageLinked(LINK_SET, 0, "", "fw_addbox : Column0 : Table : 0, 1, 8, 3");
llMessageLinked(LINK_SET, 0, "", "fw_addbox : Column1 : Column0 : 7, 0, 8, 3");
llMessageLinked(LINK_SET, 0, "", "fw_addbox : Column2 : Column1 : 7, 0, 8, 3");
llMessageLinked(LINK_SET, 0, "", "fw_addbox : UpDown : Column2 : 9, 0, 1, 3");
// Set the boxes' style.
llMessageLinked(LINK_SET, 0, "a=center", "fw_conf : ButtonOK");
llMessageLinked(LINK_SET, 0, "a=center", "fw_conf : ButtonCancel");
llMessageLinked(LINK_SET, 0, "w=none", "fw_conf : Column0");
llMessageLinked(LINK_SET, 0, "w=none", "fw_conf : Column1");
llMessageLinked(LINK_SET, 0, "w=none", "fw_conf : Column2");
// Set some text for the boxes.
llMessageLinked(LINK_SET, 0, "Some dialog", "fw_data : Dialog");
llMessageLinked(LINK_SET, 0, "OK", "fw_data : ButtonOK");
llMessageLinked(LINK_SET, 0, "Cancel", "fw_data : ButtonCancel");
llMessageLinked(LINK_SET, 0, "One\nTwo\nThree", "fw_data : Column0");
llMessageLinked(LINK_SET, 0, "123\n456\n789", "fw_data : Column1");
llMessageLinked(LINK_SET, 0, "1.2\n2.3\n3.4", "fw_data : Column2");
llMessageLinked(LINK_SET, 0, "▲\n\n▼", "fw_data : UpDown");
Dies liefert das folgende Ergebnis.
Bitte nimm dir einen Moment um alle Teile der Befehle zu verstehen.
Die ersten beiden Boxen wurden zu der Parent-Box "Dialog" hinzugefügt, also lautet der dritte Parameter von "fw_addbox" gerade "Dialog". Du kannst auch den Namen einer anderen Box als Parent angeben, dann sind die Positionsangaben relativ zu dem angegebenen Parent. Beispielsweise haben wir für den Parent von "Column1" die Box "Column0" verwendet und die Koordinaten relativ zu der oberen linken Ecke der Box angegeben. Das gleiche haben wir für die Boxen "Column2" und "UpDown" gemacht.
Nachdem die Boxen erstellt wurden haben wir einige Stileinstellungen vorgenommen. So haben wir die Ausrichtung der Dialog-Knöpfe auf zentriert eingestellt ("a=center") und den Textumbruch für die Tabellenspalten deaktiviert ("w=none"), sodass auch überlange Zeilen immer innerhalb einer Tabellenzeile bleiben.
Schließlich haben wir noch den Text der Boxen gesetzt.
Eine etwas knappere Variante
Wie bereits erwähnt können wir das vorhergegangene Beispiel auch etwas kürzer schreiben, indem wir den Stil und Text direkt beim Erstellen der Boxen angeben. Der folgende Code liefert das gleiche Ergebnis wie zuvor:
llMessageLinked(LINK_SET, 0, "OK", "fw_addbox : ButtonOK : Dialog : 1, 2, 10, 1 : a=center");
llMessageLinked(LINK_SET, 0, "Cancel", "fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center");
llMessageLinked(LINK_SET, 0, "One\nTwo\nThree", "fw_addbox : Column0 : Table : 0, 1, 8, 3 : w=none");
llMessageLinked(LINK_SET, 0, "123\n456\n789", "fw_addbox : Column1 : Column0 : 7, 0, 8, 3 : w=none");
llMessageLinked(LINK_SET, 0, "1.2\n2.3\n3.4", "fw_addbox : Column2 : Column1 : 7, 0, 8, 3 : w=none");
llMessageLinked(LINK_SET, 0, "▲\n\n▼", "fw_addbox : UpDown : Column2 : 9, 0, 1, 3");
llMessageLinked(LINK_SET, 0, "Some dialog", "fw_data : Dialog");
Box-Rahmen
FURWARE text bietet eine besondere Stil-Option die vor allem für Boxen nützlich ist: Die border-Einstellung. Wahrscheinlich sagt hier ein Beispiel mehr als tausend Worte. Schauen wir uns deshalb folgende Abänderung des letzten Beispiels an:
llMessageLinked(LINK_SET, 0, "OK", "fw_addbox : ButtonOK : Dialog : 1, 2, 10, 1 : a=center; border=lr");
llMessageLinked(LINK_SET, 0, "Cancel", "fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center; border=lr");
llMessageLinked(LINK_SET, 0, "One\nTwo\nThree", "fw_addbox : Column0 : Table : 0, 1, 8, 3 : w=none; border=lr");
llMessageLinked(LINK_SET, 0, "123\n456\n789", "fw_addbox : Column1 : Column0 : 7, 0, 8, 3 : w=none; border=lr");
llMessageLinked(LINK_SET, 0, "1.2\n2.3\n3.4", "fw_addbox : Column2 : Column1 : 7, 0, 8, 3 : w=none; border=lr");
llMessageLinked(LINK_SET, 0, "▲\n\n▼", "fw_addbox : UpDown : Column2 : 9, 0, 1, 3");
llMessageLinked(LINK_SET, 0, "Some dialog", "fw_data : Dialog");
llMessageLinked(LINK_SET, 0, "border=lrtb", "fw_conf : Dialog");
Im folgenden Bild wurden die Unterteilungen zwischen den einzelnen Faces weggelassen damit man die hinzugekommenen Rahmen besser sehen kann. Beachte wie das Textskript die Textposition automatisch an die Rahmen anpasst:
Die "border"-Einstellung akzeptiert als Wert jede (sinnvolle) Kombination der Zeichen tblrTBLR12 (die Reihenfolge ist egal). Die Kleinbuchstaben t, b, l, r fügen Rahmen am oberen (top), unteren (bottom), linken (left) und rechten (right) Rand ein. Die Großbuchstaben T, B, L, R fügen zusätzlich spezielle Symbole an den Ecken der Boxen ein um diese mit weiteren Boxen verbinden zu können (siehe auch nächstes Bild). Die Zahlen "1" oder "2" wählen andere Stile für die Rahmen aus. Hier ein paar Beispiele:
Jetzt sollte auch klar sein wieso die zuvor erwähnte Überlappung zwischen den Tabellenspalten nützlich ist: Auf diese Weise können wir für alle Tabellenspalten einfach einen linken und rechten Rand angeben ohne unterscheiden zu müssen.
Tipp: Der zum Zeichnen der Rahmen zusätzlich benötigte Platz muss manuell zu den jeweiligen Box-Größen hinzuaddiert werden. |
Boxen löschen
Das Entfernen einer Box wird mittels des "fw_delbox"-Befehls erledigt. Beispielsweise löscht der folgende Code die Knöpfe des Dialogs:
llMessageLinked(LINK_SET, 0, "", "fw_delbox : ButtonOK");
llMessageLinked(LINK_SET, 0, "", "fw_delbox : ButtonCancel");
Es können auch mehrere Boxen auf einmal gelöscht werden. Folgender Code liefert dasselbe Ergebnis:
llMessageLinked(LINK_SET, 0, "", "fw_delbox : ButtonOK : ButtonCancel");
Wichtig: Die "Basis"-Boxen der Display-Sets können nicht entfernt werden (in diesem Beispiel "Dialog" und "Table"). |
Klick-Abfragen (Touch Queries)
Das Beispiel aus dem letzten Abschnitt enthält einige Stellen auf den Boxen, die von dem Benutzer angeklickt werden können sollten, nämlich die Knöpfe des "Dialogs" und die "up"-/"down"-Knöpfe auf der Rechten Seite der Tabelle.
Mit einem speziellen Befehl kann vom FURWARE text-Skript erfragt werden, welche Box an welchen Koordinaten geklickt wurde. Das Skript rechnet dabei automatisch die Koordinaten relativ zur oberen linken Ecke der Box um und beachtet die Reihenfolge und etwaige Überlappungen zwischen Boxen.
Senden der Anfrage
Betrachten wir einen möglichen touch_start()-Handler in unserem Skript, der einen "fw_touchquery"-Befehl an das Textskript sendet:
touch_start(integer numDetected) {
string link = (string)llDetectedLinkNumber(0);
string face = (string)llDetectedTouchFace(0);
llMessageLinked(LINK_SET, 0, "Some user data", "fw_touchquery:" + link + ":" + face);
}
Wie man sehen kann, enthält der letzte Parameter von llMessageLinked() den "fw_touchquery"-Befehl gefolgt von der Link-Nummer und Face-Nummer, die geklickt wurden. Diese Werte sind durch ":" getrennt.
Du kannst außerdem einen beliebigen String als dritten Parameter von llMessageLinked() übergeben; in diesem Beispiel ist dies "Some user data". Dieser String wird bei einer Antwort vom Textskript unverändert an dein Skript zurückgegeben. Auf diese Weise kannst du Anfragen den entsprechenden Antworten zuordnen.
Verarbeiten der Antwort
Das FURWARE text Skript antwortet immer auf eine solche Anfrage, auch wenn die Angaben keinen Sinn machen (etwa wenn das geklickte Prim gar nicht zu einem Display gehört).
Der "id"-Parameter des "link_message()"-Handlers enthält immer genau den String "fw_touchreply", sodass du die Antworten einfach aus sonstigen Link Messages filtern kannst.
Der "str"-Parameter enthält die ":"-separierte Antwort auf die Anfrage. Diese hat die Form
boxName:dx:dy:rootName:x:y:userData
Die einzelnen Teile sind dabei:
- boxName ist der Name der Box, die geklickt wurde.
- dx ist die Spalte des Klicks (gezählt in Zeichen) relativ zur linken Seite der Box.
- dy ist die Zeile des Klicks relativ zur oberen Seite.
- rootName ist der Name der Basis-Box des Display-Sets, in dem sich die Box befindet.
- x ist die Spalte des Klicks (gezählt in Zeichen) relativ zur linken Seite des Display-Sets.
- y ist die Zeile des Klicks relativ zur oberen Seite des Display-Sets.
- userData ist der String, der in der Anfrage als dritter Parameter von "llMessageLinked()" übergeben wurde.
Tipp: Alle Felder bis auf "userData" sind leer wenn die Anfrage ungültig war (z.b. wenn das übergebene Prim nicht zu einem Display gehört). |
Hier ein Beispiel wie wir die Antwort in unserem Beispiel verarbeiten könnten:
link_message(integer sender, integer num, string str, key id) {
if (id == "fw_touchreply") {
list tokens = llParseStringKeepNulls(str, [":"], []);
string boxName = llList2String(tokens, 0);
integer dx = llList2Integer(tokens, 1);
integer dy = llList2Integer(tokens, 2);
string rootName = llList2String(tokens, 3);
integer x = llList2Integer(tokens, 4);
integer y = llList2Integer(tokens, 5);
string userData = llList2String(tokens, 6);
if (boxName == "ButtonOK") {
llOwnerSay("OK button was clicked.");
} else if (boxName == "ButtonCancel") {
llOwnerSay("Cancel button was clicked.");
} else if (boxName == "UpDown") {
// Wir benutzen die Y-Koordinate um festzustellen ob "hoch" oder "runter" geklickt wurde.
if (dy == 0) {
llOwnerSay("Up button was clicked.");
} else if (dy == 2) {
llOwnerSay("Down button was clicked.");
}
}
}
}
Stilvorlagen (Style Templates)
Machen wir die Knöpfe unseres Dialogs ein wenig interessanter. Wir können ihnen beispielsweise eine andere Schriftart und -farbe geben (zusätzlich zu den Rahmen auf der linken und rechten Seite sowie der zentrierten Ausrichtung). Wir könnten natürlich etwas schreiben wie:
llMessageLinked(LINK_SET, 0, "border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a", "fw_conf : ButtonOK");
llMessageLinked(LINK_SET, 0, "border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a", "fw_conf : ButtonCancel");
Das mag für dieses kleine Beispiel noch in Ordnung sein; es wirkt trotzdem etwas redundant. Wenn du mehrere Boxen oder Textpassagen hast bei denen du Stile mehrfach verwenden möchtest, dann ist es möglicherweise effizienter Vorlagen (Templates) zu verwenden.
FURWARE text erlaubt das Speichern von Strings in "Variablen", denen man einen Namen zuweisen kann. Momentan werden diese nur für die Stilvorlagen verwendet. Stecken wir also den oben angegebenen Stil in eine Variable mittels des "fw_var"-Befehls und geben der Variable den Namen "button":
llMessageLinked(LINK_SET, 0, "border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a", "fw_var : button");
Wir können diese Variable nun mittels der Syntax style=... in unserer Stildefinition verwenden. Schreiben wir die beiden "fw_conf"-Zeilen also um:
llMessageLinked(LINK_SET, 0, "style=button", "fw_conf : ButtonOK");
llMessageLinked(LINK_SET, 0, "style=button", "fw_conf : ButtonCancel");
Unser Dialog sieht dann folgendermaßen aus:
Du kannst die Vorlagen sogar mit anderen Stileinstellungen kombinieren (sogar mit anderen Templates). Wenn wir beispielsweise den "Cancel"-Knopf dunkelrot machen wollen aber die übrigen Einstellungen des "button"-Templates beibehalten, so können wir schreiben:
llMessageLinked(LINK_SET, 0, "style=button; c=darkred", "fw_conf : ButtonCancel");
Tipp: Du kannst "fw_var" auch dazu verwenden um den Inhalt einer Variablen zu ändern. Wird als Inhalt der leere String übergeben, so löscht das die Variable. Beachte, dass das Ändern einer vorhandenen Variablen ein vollständiges Aktualisieren der Anzeige nach sich zieht, da das Skript nicht weiß, welche Teile der Anzeige von der Änderung betroffen sein könnten. |
Wichtig: Stilvorlagen erlauben Rekursion (d.h. die Verwendung von Stilvorlagen innerhalb einer anderen Stilvorlage). Das Textskript prüft nicht auf unendliche Rekursion! |
Mehrere Boxen auf einmal konfigurieren
Manchmal möchtest du vielleicht denselben Text oder Stil für mehrere Boxen auf einmal setzen. Betrachten wir als Beispiel ein "Spiel-Board" mit 9 separaten Boxen für die "X" und "O"-Zellen:
Nehmen wir nun an, dass wir die mittlere Zeile folgendermaßen hervorheben möchten:
Um das zu erreichen könnten wir natürlich folgendes schreiben:
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell3");
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell4");
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell5");
Allerdings benötigt dies offensichtlich drei Link Messages. FURWARE text bietet eine spezielle Syntax der "fw_data"- und "fw_conf"-Befehle um den Text oder Stil von mehreren Boxen auf einmal einzustellen. Eine Möglichkeit in unserem Beispiel ist die Angabe aller Boxen, die konfiguriert werden sollen:
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell3 : Cell4 : Cell5");
Wenn wir annehmen, dass die Boxen in der Reihenfolge "Cell0", "Cell1", etc. zum Board hinzugefügt wurden, dann können wir den Befehl sogar noch kürzer schreiben. Wir können Intervalle von Boxen in der folgenden Schreibweise angeben (beachte das Semikolon (";") zwischen den Box-Namen!):
llMessageLinked(LINK_SET, 0, "c=red", "fw_conf : Cell3 ; Cell5");
Nehmen wir nun an, dass wir das Spiel "zurücksetzen" möchten, sodass alle Felder "?" anzeigen:
Dafür müssen wir die Farbe und den Text aller Felder zurücksetzen. Wir können hierfür die Intervall-Notation für "fw_conf" und "fw_data" verwenden:
llMessageLinked(LINK_SET, 0, "", "fw_conf : Cell0 ; Cell8");
llMessageLinked(LINK_SET, 0, "?", "fw_data : Cell0 ; Cell8");
In dem vorliegenden Beispiel können wir sogar ein Ende des Intervalls weglassen: Da "Cell8" die letzte Box im Display-Set ist können wir ihren Namen weglassen und schreiben:
llMessageLinked(LINK_SET, 0, "", "fw_conf : Cell0 ;");
llMessageLinked(LINK_SET, 0, "?", "fw_data : Cell0 ;");
Dies bedeutet "wende den Befehl auf Cell0 und alle folgenden Boxen im selben Display-Set an".
Die Intervall- und Einzel-Box-Schreibweisen können sogar gemischt verwendet werden. Betrachte den folgenden Code (die zusätzlichen Leerzeichen dienen nur der Übersichtlichkeit und können natürlich weggelassen werden):
llMessageLinked(LINK_SET, 0, "!", "fw_data : Cell1;Cell3 : Cell5 : Cell7; ");
Angewendet auf das obige Beispiel-Board ergibt dies:
Tipp: Siehe auch die Referenz für eine vollständige Übersicht aller möglichen Parameter-Notationen. |
Globale Stilvoreinstellungen
Einige Stileinstellungen können einen "globalen" Charakter haben. Beispielsweise möchtest du vielleicht eine bestimmte Schriftart für alle Boxen verwenden und diese schnell ändern können.
Im letzten Abschnitt haben wir bereits eine Möglichkeit gesehen wie wir mehreren Boxen einen Stil geben und diesen später zentral ändern können (nämlich indem wir die zugehörige Variable mittels "fw_var" ändern). Der Nachteil dieser Methode ist, dass das "style=..." für jede Box separat angegeben werden muss und wir daran denken müssen es wieder hinzuschreiben wenn wir andere Einstellungen einer Box ändern mittels "fw_conf".
Für solche Fälle bietet das Skript den Befehl "fw_defaultconf". Mit diesem Befehl kannst du globale Stileinstellungen für alle Boxen, alle Root-Boxen (d.h. alle "Basis"-Boxen der Display-Sets) und alle Nicht-Root-Boxen vornehmen.
Momentan existieren drei Varianten dieses Befehls um die oben genannten Voreinstellungen vorzunehmen. Hier einige Beispiele für die Verwendung (beachte die verschiedenen Argumente des "fw_defaultconf:..."-Befehls):
// Setzt die Voreinstellung für alle Boxen auf rot, zentriert.
llMessageLinked(LINK_SET, 0, "c=red; a=center", "fw_defaultconf");
// Setzt die Voreinstellung für alle ROOT-Boxen auf grün, kein Wrapping.
llMessageLinked(LINK_SET, 0, "c=green; w=none", "fw_defaultconf : root");
// Setzt die Voreinstellung für alle NICHT-ROOT-Boxen auf "kein Trimming".
llMessageLinked(LINK_SET, 0, "t=off", "fw_defaultconf : nonroot");
Stilangaben im Text (Inline Styles)
Bisher haben wir Stileinstellungen global und pro Box vorgenommen. FURWARE text unterstützt eine weitere Stufe dieser Einstellungen: Stileinstellungen, die direkt im Text vorgenommen werden. Dies Erlaubt ein Überschreiben der aktuellen Einstellungen für einzelne Textpassagen, beispielsweise um einzelne Wörter hervorzuheben oder einzelne Zeilen auszurichten.
So eine Einstellung wird von "<!" eingeleitet (beachte das Ausrufezeichen) und von ">" beendet. Innerhalb dieser Begrenzer kannst du Angaben über den Textstil machen. Machen wir beispielsweise den Text unseres Dialogs zentriert, weisen einem Wort eine zufällige Farbe zu und ändern die Schriftart teilweise:
llMessageLinked(LINK_SET, 0, "<!a=center>Some <!c=rand; f=5054fec3-1465-af8f-2fe5-e9507795c82a>fancy<!c=def> dialog", "fw_data : Dialog");
Das Ergebnis sieht dann in etwa so aus (die Farbe ist natürlich bei jeder Aktualisierung zufällig):
Schau' dir den Code genau an: Wir haben die spezielle Einstellung "c=def" verwendet um die normale Farbe der Box nach dem Wort "fancy" wiederherzustellen, allerdings haben wir die Schriftart nicht zurückgesetzt. Das bedeutet, dass die Schriftart für den Rest des Texts geändert bleibt. Du kannst den speziellen Wert "def" für alle Einstellungen (Farbe, Schriftart, Ausrichtung, etc.) verwenden um die Standardeinstellung der Box wiederherzustellen.
Tipp: Du kannst Stilvorlagen auch direkt im Text mittels dem "style"-Befehl verwenden. |
Wichtig: Die "border"-Einstellung im Fließtext zu verwenden hat keinen Effekt. |
Wichtig: Ausrichtung, Trimmen und Umbruch dürfen nur direkt am Anfang einer neuen Zeile (d.h. auch direkt nach jedem "\n") verwendet werden und haben dann Auswirkung auf diese und folgende Zeilen. |
Inline Styles selektiv deaktivieren
Unter Umständen möchtest du Stilangaben im Text für bestimmte Teile deines Displays deaktivieren, beispielsweise bei der Darstellung von Benutzereingaben wo ein "<!" nicht als der Anfang von Stilangaben interpretiert werden soll.
Kurioserweise ist der Befehl dafür selbst eine Stileinstellung, nämlich "tags=off". Nachdem diese Angabe verarbeitet wurde werden keine weiteren "<!" mehr interpretiert. Beispielsweise deaktiviert der folgende Befehl Stilangaben im Text unseres "Dialogs":
llMessageLinked(LINK_SET, 0, "border=tblr; tags=off", "fw_conf : Dialog");
Du kannst diese Einstellung sogar "inline" verwenden, aber nur am Anfang von Zeilen (genauso wie bei Ausrichtung usw.). Dann werden Angaben für den Rest der Zeile und alle weiteren Zeilen ignoriert (es gibt dann ja keine Möglichkeit mehr, die Stilangaben innerhalb der Zeile wieder zu aktivieren).