FURWARE text/Tutorial/de

From Second Life Wiki
Jump to: navigation, search


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.
 
 
        }
    }
}


KBtip2.png 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.


KBcaution.png 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:


FURWARE text single example 0.png


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:


FURWARE text single example 1.png


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:


FURWARE text single example 2.png


KBtip2.png 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":


FURWARE text multi example 0.png


KBtip2.png 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:


FURWARE text multi example 1.png


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:


FURWARE text multi example 2.png


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.


FURWARE text boxes example 0.png


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.


FURWARE text boxes example 1.png


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:


FURWARE text boxes example 2.png


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:


FURWARE text boxes example 3.png


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.


KBtip2.png 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");


KBcaution.png 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.


KBtip2.png 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:


FURWARE text tmpl example 0.png


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");


KBtip2.png 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.


KBcaution.png 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:


FURWARE text range example 0.png


Nehmen wir nun an, dass wir die mittlere Zeile folgendermaßen hervorheben möchten:


FURWARE text range example 1.png


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:


FURWARE text range example 2.png


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:


FURWARE text range example 3.png


KBtip2.png 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):


FURWARE text inline example 0.png


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.


KBtip2.png Tipp: Du kannst Stilvorlagen auch direkt im Text mittels dem "style"-Befehl verwenden.


KBcaution.png Wichtig: Die "border"-Einstellung im Fließtext zu verwenden hat keinen Effekt.


KBcaution.png 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).