Calyn Canning
Aktiver Nutzer
Ein Trinkgeld-Script (in Secondlife auch bekannt unter dem Namen Tip-Jar) sammelt für eine bestimmte Person Trinkgelder und zeigt die Summe dieser Gelder über dem Objekt an.
Voraussetzungen: Bauen einer Box in Secondlife sowie das Anwählen des Reiters Inhalt/Content im Baumenu für dieses Objekt.
Ziel des Tutorials: Verstehen, was Zustände sind, wie der Grundaufbau eines Scriptes ist, was Ereignisse sind und wie Funktionen und Variablen benutzt werden.
1. Zuerst erstellen wir in Secondlife eine Box und wählen über das Baumenu unter dem Reiter Inhalt/Content die Option New Script. Wir werden daraufhin im Chatfenster mit den Worten "Hello, Avatar" von unserem neuen Script begrüßt. Manchmal kann es vorkommen, dass es eine kleine Verzögerung gibt, also nicht mehrmals drücken, sondern ein paar Sekunden zur Not gedulden.
2. Durch einen Klick mit der rechten Maustaste auf das Script, kann das Script umbenannt, geöffnet und gelöscht werden. Wir geben dem Script erst einmal einen Namen und öffnen es anschliessend. Nun sehen wir folgendes vor uns:
3. Zuerst soll der oben stehende Programmcode kurz erklärt und verstanden werden, bevor wir mit der Erstellung des Trinkgeld-Scriptes fortfahren. Wer den oben stehenden Programmcode jedoch bereits versteht, kann in Punkt 7 weiterlesen.
4. Das Wort default steht für einen Zustand des Scriptes, genauer gesagt den wichtigsten Zustand des Scriptes. Dieser muss verpflichtend in jedem Script vorkommen und wird beim Starten des Scriptes automatisch aktiviert. Der Programmierer eines Scriptes kann auch eigene Zustände definieren, wie wir später auch an unserem Trinkgeld-Script feststellen werden. Bei der Secondlife-Programmierung gilt wie bei einigen anderen Programmiersprachen auch die Klammerung von Programmcode-Blöcken durch die geschweiften Klammern "{" und "}".
5. Innerhalb des Programmcode-Blocks des Zustandes default gibt es zwei Ereignisse, diese sind state_entry() und touch_start(integer total number). Das Ereignis state_entry() findet statt, sobald das Script in den Zustand geht, von dem das Ereignis umschlossen wird, in diesem Fall also beim Eintritt des Zustandes default. Das Ereignis touch_start(integer total_number) ist das Ereignis, welches beim Anklicken eines Objektes gestartet wird, in den runden Klammern wird dabei ein Parameter des Type integer (eine ganze Zahl) mit dem Namen total_number übergeben, ein Parameter stellt eine Zusatzinformation dar, welche dem Ereignis mitgegeben wird, in diesem Fall die Anzahl der das Objekt anklickenden Avatare.
6. In beiden Zuständen wird innerhalb der Programmcode-Blöcke des Ereignisses lediglich eine Funktion aufgerufen. Diese Funktion ist eine Standardfunktion von Secondlife, man erkennt sich an den beiden vorangestellten beiden kleinen "L" im Befehl llSay, welcher das Script zum Sprechen bringen kann. Auch die Funktion hat 2 solcher Parameter, der erste Parameter ist der Chat-Kanal, auf dem die Nachricht gesendet wird und der zweite Parameter enthält die Nachricht.
7. Wir wollen nun dazu übergehen und das Script an unsere Bedürfnisse anzupassen. Zuerst überlegen wir uns hierzu eine passende Struktur, welche anschließend programmiert werden soll. Das folgende Script macht noch gar nichts, es wird lediglich die spätere Struktur vorgegeben und mit Kommentaren (diese werden eingeleitet mit //) die Abläufe innerhalb dieser Struktur beschrieben.
8. Dem aufmerksamen Betrachter wird nun auffallen, dass es genau drei dieser Zustände gibt, den bereits vorgestellten Zustand default, welcher verpflichtend in jedem Script vorkommen muss, sowie die beiden selbst definierten Zustände inaktiv und aktiv. Wir benutzen den Zustand default um am Anfang einige wichtig Informationen zu bekommen und zu speichern. Im Anschluss daran soll das Script in den Zustand inaktiv wehseln bis der Besitzer es mit einem Klick aktiviert. Von da an soll es Spenden sammeln bis der Besitzer es mit einem erneuten Klick ausschaltet (in den Zustand inaktiv bringt).
9. An dieser Stelle wollen wir uns nun Gedanken machen über benötigte Variablen, die wir im Script benötigen. In Variablen können wir Informationen speichern. Für unser Trinkgeld Script wollen wir auf folgende Informationen zurückgreifen: Name des Besitzers und die Gesamtsumme der Spenden. Beim Namen des Besitzers handelt es sich um eine Zeichenkette also um einen string, bei der Gesamtsumme der Spenden um eine ganze Zahl, also vom Typ integer, damit wir auch damit rechnen können. Wir machen diese beiden Variablen vor dem Zustand default bekannt. Dies hat den Vorteil, dass sie überall im Script benutzt werden können.
10. Wir wollen nun den Zustand default programmieren. Eine Erklärung zu den einzelnen Funktionen ist diesen als Kommentar vorangestellt.
11. Der Zustand default ist damit nun fertig ausprogrammiert und es geht nun an das "Eingemachte". Wir wollen uns zuerst den Zustand inaktiv vornehmen und diesen programmieren und im Anschluss die eigentliche Funktionalität des Trinkgeld-Scriptes hinzufügen.
12. Mit diesem Programmcode haben wir auch den inaktiven Status des Trinkgeld-Scriptes programmiert. Was haben wir genau gemacht? Zuerst haben wir bei der Anwahl des Zustandes einen weissen (<1,1,1> ergibt weiss) Text über dem Objekt auf "Trinkgelder inaktiv" gesetzt. Dann haben wir die Gesamtsumme an Trinkgeldern auf 0 gesetzt. Für das Ereignis, dass das Objekt angeklickt wird, haben wir überprüft ob der Besitzer geklickt hat und wenn dies der Fall ist, sind wir in den Zustand aktiv gesprungen. Dieser muss nun noch programmiert werden.
13. Wenn du nun noch nicht aufgegeben hast, dann kannst du nun getrost aufatmen, denn wir sind fast fertig. Wir haben nun den aktiven Zustand programmiert, hierbei gibt es im Gegensatz zu den vorangegangenen Zuständen nicht zwei sondern drei Ereignisse. Zusätzlich zu den Ereignissen state_entry() und touch_start(integer total_number) gibt es hier noch das Ereignis money(key
Voraussetzungen: Bauen einer Box in Secondlife sowie das Anwählen des Reiters Inhalt/Content im Baumenu für dieses Objekt.
Ziel des Tutorials: Verstehen, was Zustände sind, wie der Grundaufbau eines Scriptes ist, was Ereignisse sind und wie Funktionen und Variablen benutzt werden.
1. Zuerst erstellen wir in Secondlife eine Box und wählen über das Baumenu unter dem Reiter Inhalt/Content die Option New Script. Wir werden daraufhin im Chatfenster mit den Worten "Hello, Avatar" von unserem neuen Script begrüßt. Manchmal kann es vorkommen, dass es eine kleine Verzögerung gibt, also nicht mehrmals drücken, sondern ein paar Sekunden zur Not gedulden.
2. Durch einen Klick mit der rechten Maustaste auf das Script, kann das Script umbenannt, geöffnet und gelöscht werden. Wir geben dem Script erst einmal einen Namen und öffnen es anschliessend. Nun sehen wir folgendes vor uns:
Code:
default
{
state_entry()
{
llSay(0, "Hello, Avatar!");
}
touch_start(integer total_number)
{
llSay(0, "Touched!");
}
}
3. Zuerst soll der oben stehende Programmcode kurz erklärt und verstanden werden, bevor wir mit der Erstellung des Trinkgeld-Scriptes fortfahren. Wer den oben stehenden Programmcode jedoch bereits versteht, kann in Punkt 7 weiterlesen.
4. Das Wort default steht für einen Zustand des Scriptes, genauer gesagt den wichtigsten Zustand des Scriptes. Dieser muss verpflichtend in jedem Script vorkommen und wird beim Starten des Scriptes automatisch aktiviert. Der Programmierer eines Scriptes kann auch eigene Zustände definieren, wie wir später auch an unserem Trinkgeld-Script feststellen werden. Bei der Secondlife-Programmierung gilt wie bei einigen anderen Programmiersprachen auch die Klammerung von Programmcode-Blöcken durch die geschweiften Klammern "{" und "}".
5. Innerhalb des Programmcode-Blocks des Zustandes default gibt es zwei Ereignisse, diese sind state_entry() und touch_start(integer total number). Das Ereignis state_entry() findet statt, sobald das Script in den Zustand geht, von dem das Ereignis umschlossen wird, in diesem Fall also beim Eintritt des Zustandes default. Das Ereignis touch_start(integer total_number) ist das Ereignis, welches beim Anklicken eines Objektes gestartet wird, in den runden Klammern wird dabei ein Parameter des Type integer (eine ganze Zahl) mit dem Namen total_number übergeben, ein Parameter stellt eine Zusatzinformation dar, welche dem Ereignis mitgegeben wird, in diesem Fall die Anzahl der das Objekt anklickenden Avatare.
6. In beiden Zuständen wird innerhalb der Programmcode-Blöcke des Ereignisses lediglich eine Funktion aufgerufen. Diese Funktion ist eine Standardfunktion von Secondlife, man erkennt sich an den beiden vorangestellten beiden kleinen "L" im Befehl llSay, welcher das Script zum Sprechen bringen kann. Auch die Funktion hat 2 solcher Parameter, der erste Parameter ist der Chat-Kanal, auf dem die Nachricht gesendet wird und der zweite Parameter enthält die Nachricht.
7. Wir wollen nun dazu übergehen und das Script an unsere Bedürfnisse anzupassen. Zuerst überlegen wir uns hierzu eine passende Struktur, welche anschließend programmiert werden soll. Das folgende Script macht noch gar nichts, es wird lediglich die spätere Struktur vorgegeben und mit Kommentaren (diese werden eingeleitet mit //) die Abläufe innerhalb dieser Struktur beschrieben.
Code:
default
{
on_rez(integer start_param)
{
// Beim Aufbauen der Box in den Ausgangszustand bringen
}
state_entry()
{
// Informationen abfragt und für die weitere Verwendung speichern
}
}
state inaktiv
{
state_entry()
{
// Informationstext über der Box teilt mit, dass das Script nicht aktiv ist
}
touch_start(integer total_number)
{
// Nur der Besitzer der Box darf das Script mit einem Klick aktivieren
}
}
state aktiv
{
state_entry()
{
// Informationstext über der Box teilt mit, dass das Script aktiv ist
}
touch_start(integer total_number)
{
// Nur der Besitzer des Objektes darf das Script mit einem Klick deaktivieren
}
money(key giver, integer amount)
{
// Bei Erhalt eines Trinkgeldes soll dem Spender gedankt werden und die neue Summe angezeigt werden
}
}
8. Dem aufmerksamen Betrachter wird nun auffallen, dass es genau drei dieser Zustände gibt, den bereits vorgestellten Zustand default, welcher verpflichtend in jedem Script vorkommen muss, sowie die beiden selbst definierten Zustände inaktiv und aktiv. Wir benutzen den Zustand default um am Anfang einige wichtig Informationen zu bekommen und zu speichern. Im Anschluss daran soll das Script in den Zustand inaktiv wehseln bis der Besitzer es mit einem Klick aktiviert. Von da an soll es Spenden sammeln bis der Besitzer es mit einem erneuten Klick ausschaltet (in den Zustand inaktiv bringt).
9. An dieser Stelle wollen wir uns nun Gedanken machen über benötigte Variablen, die wir im Script benötigen. In Variablen können wir Informationen speichern. Für unser Trinkgeld Script wollen wir auf folgende Informationen zurückgreifen: Name des Besitzers und die Gesamtsumme der Spenden. Beim Namen des Besitzers handelt es sich um eine Zeichenkette also um einen string, bei der Gesamtsumme der Spenden um eine ganze Zahl, also vom Typ integer, damit wir auch damit rechnen können. Wir machen diese beiden Variablen vor dem Zustand default bekannt. Dies hat den Vorteil, dass sie überall im Script benutzt werden können.
Code:
string besitzername;
integer gesamtsumme;
10. Wir wollen nun den Zustand default programmieren. Eine Erklärung zu den einzelnen Funktionen ist diesen als Kommentar vorangestellt.
Code:
default
{
// Das Ereignis on_rez tritt ein, sobald die Box "gerezzt" (aufgestellt) wird.
on_rez(integer start_param)
{
// llResetScript(); startet das Script neu.
llResetScript();
}
state_entry()
{
// Name des Besitzers in die Variable besitzername speichern
// Hierzu ermitteln wir den Key (Schlüssel) des Besitzers mit der Funktion llGetOwner();
key besitzerkey = llGetOwner();
// Nun ermitteln wir aus dem Key den Namen des Besitzers mit der Funktion llKey2Name();
besitzername = llKey2Name(besitzerkey);
// Wir springen in den Zustand inaktiv
state inaktiv;
}
}
11. Der Zustand default ist damit nun fertig ausprogrammiert und es geht nun an das "Eingemachte". Wir wollen uns zuerst den Zustand inaktiv vornehmen und diesen programmieren und im Anschluss die eigentliche Funktionalität des Trinkgeld-Scriptes hinzufügen.
Code:
state inaktiv
{
state_entry()
{
// Informationstext über der Box teilt mit, dass das Script nicht aktiv ist
// Die Funktion llSetText() erwartet drei Parameter, den angezeigten Text, einen Farbvektor und die Stärke des Textes
llSetText("Trinkgelder inaktiv",<1,1,1>,1);
// Der Gesamtbetrag für die Trinkgelder wird an dieser Stelle auf 0 gesetzt
gesamtsumme = 0;
}
touch_start(integer total_number)
{
// Nur der Besitzer der Box darf das Script mit einem Klick aktivieren
// Wir ermitteln den Key des Besitzers und den Key des Klickenden und vergleichen beide
key besitzer = llGetOwner();
key klickender = llDetectedKey(0);
// Vergleichen und wenn gleich in den Zustand aktiv springen
if (besitzer == klickender)
state aktiv;
}
}
12. Mit diesem Programmcode haben wir auch den inaktiven Status des Trinkgeld-Scriptes programmiert. Was haben wir genau gemacht? Zuerst haben wir bei der Anwahl des Zustandes einen weissen (<1,1,1> ergibt weiss) Text über dem Objekt auf "Trinkgelder inaktiv" gesetzt. Dann haben wir die Gesamtsumme an Trinkgeldern auf 0 gesetzt. Für das Ereignis, dass das Objekt angeklickt wird, haben wir überprüft ob der Besitzer geklickt hat und wenn dies der Fall ist, sind wir in den Zustand aktiv gesprungen. Dieser muss nun noch programmiert werden.
Code:
state aktiv
{
state_entry()
{
// Informationstext über der Box teilt mit, dass das Script aktiv ist
llSetText("Trinkgelder " + besitzername + "
Bisher noch nichts gespendet!",<1,1,1>,1);
}
touch_start(integer total_number)
{
// Nur der Besitzer der Box darf das Script mit einem Klick deaktivieren
key besitzer = llGetOwner();
key klickender = llDetectedKey(0);
// Vergleichen und wenn gleich in den Zustand inaktiv springen
if (besitzer == klickender)
state inaktiv;
}
money(key giver, integer amount)
{
// Bei Erhalt eines Trinkgeldes soll dem Spender gedankt werden und die neue Summe angezeigt werden
llSay(0,"Danke fuer deine Spende, " + llKey2Name(giver) + "!");
// Trinkgelder addieren
gesamtsumme += amount;
// Informationstext aktualisieren
llSetText("Trinkgelder " + besitzername + "
Bisher " + (string)gesamtsumme + " L $ gespendet!",<1,1,1>,1);
}
}
13. Wenn du nun noch nicht aufgegeben hast, dann kannst du nun getrost aufatmen, denn wir sind fast fertig. Wir haben nun den aktiven Zustand programmiert, hierbei gibt es im Gegensatz zu den vorangegangenen Zuständen nicht zwei sondern drei Ereignisse. Zusätzlich zu den Ereignissen state_entry() und touch_start(integer total_number) gibt es hier noch das Ereignis money(key