• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

[Tutorial] Variablen fuer absolute Anfaenger

Daemonika Nightfire

Forumsgott/göttin
hi,

manch anderen Scriptern hier im Forum werden sich bei diesem Beitrag zwar die Fussnaegel aufrollen, aber mir geht es ums verstehen und nicht um Vokabeln.

Eine Variable setzt sich aus 3 Komponenten zusammen Daten Typ, Typen Name, Daten Wert.
Typen gibt es im LSL nur 7 verschiedene (siehe unten), bei den Namen sind deiner Fantasie keine Grenzen gesetzt und der Wert richtet sich nach dem Format bzw. Anforderung.

Code:
[COLOR="#FF8C00"]// typ Name = Wert;[/COLOR]
key UUID            = "61ee201a-81cf-4322-b9a8-a5eb8da777c2"; [COLOR="#FF8C00"]// bloecke = 8-4-4-4-12[/COLOR]
string Text         = "bla bla bla";
integer Ganzzahl    = 1; [COLOR="#FF8C00"]// moegliche Werte min. −2147483648 - 0 - max. +2147483647[/COLOR]
float Kommawert     = 1.0; [COLOR="#FF8C00"]// moegliche Werte min. 1.401298464E-45 - max. 3.402823466E+38 (bitte was?)[/COLOR]
vector DreierFloat  = <1.0,1.0,1.0>; [COLOR="#FF8C00"]// Dreidimensional fuer Farben, **Rotationen, TexturOffset, Positionen.[/COLOR]
rotation Quaternion = <1.0,1.0,1.0,1.0>; [COLOR="#FF8C00"]// **Vierdimensional fuer Rotationen Ausschliesslich[/COLOR]
list Kontainer      = ["61ee201a-81cf-4322-b9a8-a5eb8da777c2", "blablabla", 1, 1.0, <1.0,1.0,1.0>, <1.0,1.0,1.0,1.0>];

- key -
Ein key kann alles sein.
Alles was du in SL siehst hat eine UUID, angefangen bei den Avataren ueber Prims, Sculpties, Mesh, Texturen, Sounds und so weiter.
Bei der Verwendung von Keys muss dir im Vorfeld schon klar sein, um was es sich bei der UUID handelt. Zum Beispiel kannst du keinen Avatar Key im llSetTexture verwenden, da die Flaeche dann garantiert grau bleibt.

Beispiel:
Code:
key TextureUUID = "cc41beb3-0d13-3e05-df36-e00caa3372a7";
default
{
    touch_start(integer total_number)
    {
        llSetTexture(TextureUUID, ALL_SIDES);
    }
}


- string -
Der string ist das gaengige Format fuer die Komunikation.
Sei es als Chat Meldung, Notecard Inhalt, Email, Linked Message und sogar Hovertext.
Das bedeutet allerdings auch, das ausnahmslos jede Variable die du an ein anderes Object oder an einen Avatar senden moechtest, erst in einen string umgewandelt werden muss.
Handelt es sich bei dem Empfaenger um ein Script, muss dieser string von diesem Script wieder zurueck konvertiert werden. (mehr zum Thema Konvertieren spaeter...)

Beispiel:
Code:
string Message = "Hello, Avatar!";
default
{
    touch_start(integer total_number)
    {
        llSay(0, Message);
    }
}


- integer -
Der integer wird haeufig zum zaehlen und rechnen verwendet.
Allerdings steht der integer noch fuer viele andere Dinge wie: LinkNumber, ObjectFace, ChatChannel, ListenIndex, LindenDollar und vieles mehr wo absolute werte verlangt werden.
Im folgenden Beispiel kannst du schon sehen wie fuer eine Chat-Ausgabe ein integer zu einem string konvertiert wird.

Beispiel:
Code:
integer Count = 0;
default
{
    touch_start(integer total_number)
    {
        Count += 1;
        llSay(0, (string)Count);
    }
}


- float -
Mit float berechnet man stellen hinterm Komma.
Dabei spielt es keine Rolle wie viele Stellen hinterm Komma angezeigt werden, sobald im LSL eine Zahl mit einem punkt getrennt wird handelt es sich um einen float.
Bei den seltsamen minimal und maximal Werten bezueglich des floats empfehle ich einfach sich an den Vorgaben der einzelnen Befehle zu richten.
Zum Beispiel kann ein Alpha Wert immer nur zwischen min. 0.0 und max. 1.0 liegen. Minuswerte werden hierbei nicht unterstuetzt. Das selbe gilt fuer Glow, Lautsterke, Farbcodes und so weiter.

Beispiel:
Code:
float Alpha = 0.5;
default
{
    touch_start(integer total_number)
    {
        llSetAlpha(Alpha, ALL_SIDES);
    }
}


- vector -
Der vector kann in LSL fuer verschiedene Dinge eingesetzt werden.
Beispielsweise als x,y,z Achse fuer Positionen und Rotationen (llTargetOmega) oder als Koordinaten fuer die Positionen von Avataren oder Objecten auf einer Region/Linkset.
Weiterhin wird der vector fuer Farbcodes und Textur-Offsets verwendet. Beim Textur-Offest ist allerdings zu beachten, das die Z Achse ignoriert wird, weil Texturen halt nur 2 dimensional sind.
Bei genauerer Betrachtung wird man feststellen, das es sich bei den 3 Werten innerhalb des vectors jeweils um einen einzelnen float handelt.

Beispiel:
Code:
vector Color = <1.0, 0.0, 0.0>;
default
{
    touch_start(integer total_number)
    {
        llSetColor(Color, ALL_SIDES);
    }
}


- rotation -
Die rotation ist das eigentliche Format, womit der Server Objectausrichtungen verarbeitet.
Wenn man zum Beispiel ein Object per Script um 90° drehen moechte, kann der server mit dem uns verstaendlichen 3 dimensionalen vector ueberhaupt nichts anfangen.
Eine rotation im Kopf berechnen und von Hand einstellen ist nahezu unmoeglich, darum kann man dafuer den verstaendlichen vector zwar benutzen, muss ihn aber fuer den server in Quaternion umrechnen. Wer Migraene haben moechte, kann sich gerne die Berechnungen von rotation (cuaternion) auf der Wiki http://wiki.secondlife.com/wiki/Quaternion ansehen, ich verwende lieber folgenden Befehl fuer die Umrechnung. llSetRot(llEuler2Rot(<0, 0, 90> * DEG_TO_RAD));
Natuerlich kann man diesen befehl auch rueckwaerts verwenden, einen entsprechenden Konverter kannst du hier finden: http://wiki.secondlife.com/wiki/Use...cripts/Tools_(de)#.2ADS.2A_Rotation_Converter

Beispiel:
Code:
vector Grad = <0, 0, 90>;
default
{
    touch_start(integer total_number)
    {
        llSetRot(llEuler2Rot(Grad * DEG_TO_RAD));
    }
}


- list -
Listen koennen alles enthalten.
In einer Liste kann man alles speichern, kniffelig wird es erst wenn man diese Daten wieder einzeln heraus ziehen moechte.
Bei listen ist wichtig zu wissen, das der Stellenwert der Variablen (integer ListenIndex) immer mit 0 beginnt.
Hat man zum Beispiel 5 Eintraege in einer liste, beginnt man mit 0 zu zaehlen und endet bei 4. (5 Eintraege = [0,1,2,3,4])

Beispiel:
Code:
list Hovertext = ["bla bla bla",<1.000,0.000,0.000>,1.0];
default
{
    touch_start(integer total_number)
    {
        string text = llList2String(Hovertext, 0);
        vector color = llList2Vector(Hovertext, 1);
        float alpha = llList2Float(Hovertext, 2);
        llSetText(text, color, alpha);
    }
}
(So etwas macht man normalerweise nicht fuer einen Hovertext, aber ich fand es ein gutes Beispiel verschiedene Daten in einer Liste darzustellen.)

Wie nun Variablen im einzelnen verwendet werden koennen und in wie fern sich die Gueltigkeit der Variablen im Script verhaelt habe ich auf deutsch in der offiziellen Wiki http://wiki.secondlife.com/wiki/User:Daemonika_Nightfire/Scripts/Variable_Tutorial beschrieben.


Nachtrag:
Eines hatte ich noch vergessen zu erwaehnen.
Fuer den Fall das du dir nicht sicher bist, welche Variablen von einem Befehl akzeptiert werden und in welcher Reihenfolge sie eingetragen werden muessen, zeige einfach mit der Maus direkt auf den entsprechenden Befehl. Die Befehle haben einen MouseOver Effect und zeigen dir ein kleines Popup mit den noetigen Informationen.

LG
Dae
 
Zuletzt bearbeitet:
Da du die Typenkonervertierung angesprochen hast sollte man eventuell bei Integer noch folgendes hinzufügen, das gern von Anfängern nicht bedacht wird:

Man muss bisschen aufpassen, wenn man Floats (also Fließkommazahlen) per Typenkonvertierung in Integer (Ganze Zahlen) umwandelt. Dabei wird nämlich immer abgerundet, wie bei llFloor().
Code:
float a = 3.1;
integer b;
b = (integer) a;
 // b hat jetzt den Wert 3

a= 3.5;
b = (integer) a;
 // b hat jetzt den Wert 3

a= 3.9;
b = (integer) a;
 // b hat jetzt immer noch den Wert 3
Will man "normal" runden, dann muss man llRound() verwenden um aus einem Float den nächsten passenden Integer zu machen. Damit wird dann normal, also kaufmännisch gerundet.

Bei Integer muss man auch beachten, dass dies "Ganze Zahlen in 32 bit" sind und daher nur Werte zwischen - 2.147.483.647 und 2.147.483.647 annehmen können. [((2^32)/2)-1 ]
Floats sind "32-bit Fließkommazahlen nach IEEE-754" und können dagegen alle Werte zwischen etwa 1.4E-45 und 3.4E38 annehmen, wobei wie Erwähnt in vielen Funktionen nur ein Intervall von 0.0 bis 1.0 zulässig ist. Anm: (1.4E-45 bedeutet einfach: 1.4 * 10^(-45), floats können in LSL aber auch direkt in der wissenschaftlichen Notation angegeben werden).
Das heißt, dass man nicht jeden Float einfach so in einen Integer umwandeln kann - ist der Float zu groß, dann gibt es einen "Überlauf", und der Wert des Integers springt über den Positiven Wert hinaus und ist plötzlich wieder bei den negativen Werten.

Code:
float a = 3.5E10;
integer b = (integer) a;
llSay(0, (string) a);
//Ausgabe: 35000000000.000000
llSay(0, (string) b);
//Ausgabe: -2147483648 oder sonst irgendwas komisches...falsches.
 
Zuletzt bearbeitet:
Hab auch noch was ;)

- integer - sind auch boolesche Werte wie "false" und "true". Sie sind analoge Werte zu 0 und 1 und damit ganze Zahlen.
Das mag etwas verwirren ...
 
Zuletzt bearbeitet:
Piekst mal Shirley :p
Es wird nicht abgerundet, es wird abgeschnitten. (beim Umwandeln von Gleitkommazahl zu Ganzzahl)
Das kommt zwar unterm Strich aufs Selbe raus, aber könnte zu falschen Schlußfolgerungen führen.

ergänzend:
Keys sind auch Strings, aber LSL verlangt in vielen Fällen (nicht allen wie zb llSetPrimitiveParams) explizit eine Zuweisung durch ein vorangestelltes (key) bzw (string)
Keys verlangen keine Stringzerlegung um sie auf Gültigkeit zu überprüfen (es ist eine Keyvariable und diese ist nicht alles Nullen)
if(key) { ; }
genügt
 

Users who are viewing this thread

Zurück
Oben Unten