Difference between revisions of "User:Daemonika Nightfire/Scripts/Ablaufsteuerung"

From Second Life Wiki
Jump to navigation Jump to search
Line 98: Line 98:
===do while===
===do while===
* In der do while Schleife werden die Angaben erst in der letzten Zeile vorgenommen while(counter < limit);
* In der do while Schleife werden die Angaben erst in der letzten Zeile vorgenommen while(counter < limit);
* Hierbei wird der counter direkt mit dem limit verglichen.
* Hierbei wird der counter direkt mit dem limit verglichen und hinter der Anweisung befindet sich ein Semikolon.
* Diese Schleife zaehlt zu meinen Favoriten, weil es auf mich viel klarer strukturiert wirkt.
* Diese Schleife zaehlt zu meinen Favoriten, weil es auf mich viel klarer strukturiert wirkt.



Revision as of 02:37, 12 January 2020

Ablaufsteuerung

  • Auch auf dieser Seite verwende ich das gleiche Format wie bei den anderen tutorials. Der OwnerKey und die entsprechende Funktion zum umbenennen des Objects im state_entry dient lediglich der Erkennbarkeit fuer den Inworld Unterricht.

Schleifen

Waerend ein Timer im direkten Vergleich einer unendlichen Funktion entspricht, stellen Schleifen eine endliche Form einer sich wiederholenden Funktion dar. Schleifen sind ideal dazu geeignet, Listen abhaengige Funktionen abzuarbeiten, ohne einen weiteren Event auszuloesen.


Folgende Beispiele verwenden ein kuenstliches Limit (limit) und einen Index (i) welcher einem Counter (Zaehlwerk) entspricht. Das limit und der index muessen nicht zwangslaeufig gleich sein. Wir haben 3 verschiedene Moeglichkeiten Schleifen zu erzeugen, als da waere die for, do while & while. Jede dieser Schleifen auf dieser Seite macht genau das gleiche und fuehrt zum selben Ergebnis. Sie begninnen bei 0 und zaehlen jeweils 10x hoch und wiederholen die enthaltene Funktion bis das das Limit erreicht ist.

  • Ich schreibe absichtlich 10x und nicht bis 10 zaehlen, weil das naemlich nicht stimmt.
  • Erklaerung: 10x von 0 an gezaehlt entspricht 9, weil der Anfang des index jeweils mit 0 angegeben ist.
  • Weiterhin achte auf das kleiner als Zeichen < das ist nicht das gleiche wie <=.
  • Das bedeutet, mit < (kleiner als) endet der index nach dem 10. Durchlauf 1 vor dem Limit und mit <= (kleiner gleich) wird bis auf das angegebene Limit gezaehlt entspricht 11 Durchlaeufen.
  • Zusaetzlich macht es auch noch einen unterschiedlich, ob du innerhalb der Anweisung for, do while & while das i vor oder nach die ++ setzt.
  • Die kombination while(i++ < limit); entspricht 11 und die Kombination while(i++ <= limit); zaehlt sogar 12 mal.

Grundsaetzlich spielt es mittlerweile keine Rolle mehr, welche der 3 Schleifen nun schneller ist als die anderen. Seit Mono und seit dem die Server so schnell geworden sind, macht es keinen spuerbaren Unterschied mehr. Im Gegenteil, hin und wieder muss ich die Funktionen sogar kuenstlich drosseln, eben weil es zu schnell ist. So gesehen ist es nur noch reine Geschmackssache, welche Schleife man verwenden moechte.

KBnote.png Note: Beachte das der index-counter in der alternativen Methode nicht in der Anweisung steht und die ++ Zeichen sich dahinter statt davor befinden.

for

  • Bei der einfachen for Schleife sind alle notwendigen Angaben fuer die Anweisung gleich in der ersten Zeile for(start; vergleich; counter)
  • Diese Variante ist sehr weit verbreitet, doch fuehlt sich fuer mich nach einer gezwungenen Funktion an.
for Schleife alternative Methode
key owner;

integer limit = 10; // limit

default
{
    state_entry()
    {
        owner = llGetOwner();
        llSetObjectName("Schleife 01 " + llKey2Name(owner));
    }

    touch_start(integer total_number)
    {
        integer i; // index
        
        // innerhalb der for Anweisung wird der index auf 0 gesetzt,...
        // festgestellt ob der index kleiner als das limit ist,...
        // und am schluss der index um je 1 erhoeht.
        for(i = 0; i < limit; ++i) 
        {
            llSay(0, (string)i); // gibt den aktuellen index Wert zurueck.
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}
key owner;

integer limit = 10; // limit

default
{
    state_entry()
    {
        owner = llGetOwner();
        llSetObjectName("Schleife 01b " + llKey2Name(owner));
    }

    touch_start(integer total_number)
    {
        integer i = 0; // index
        
        // bei dieser Methode wird der index vorher auf 0 gesetzt,...
        // in der Anweisung festgestellt ob der index kleiner als das limit ist.
        for(; i < limit;)
        {
            llSay(0, (string)i);
            i++; // der index erhoeht sich bei jedem Durchgang um 1.
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}

do while

  • In der do while Schleife werden die Angaben erst in der letzten Zeile vorgenommen while(counter < limit);
  • Hierbei wird der counter direkt mit dem limit verglichen und hinter der Anweisung befindet sich ein Semikolon.
  • Diese Schleife zaehlt zu meinen Favoriten, weil es auf mich viel klarer strukturiert wirkt.
do while Schleife alternative Methode
key owner;

integer limit = 10; // limit

default
{
    state_entry()
    {
        owner = llGetOwner();
        llSetObjectName("Schleife 02 " + llKey2Name(owner));
    }

    touch_start(integer total_number)
    {
        integer i = 0; // index
        
        // in dieser Schleife wird erst am Ende die Anweisung erteilt.
        do
        {
            llSay(0, (string)i); // gibt den aktuellen index Wert zurueck.
        }
        while(++i < limit); // index counter in der while Anweisung.
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}
key owner;

integer limit = 10; // limit

default
{
    state_entry()
    {
        owner = llGetOwner();
        llSetObjectName("Schleife 02b " + llKey2Name(owner));
    }

    touch_start(integer total_number)
    {
        integer i = 0; // index
        
        do
        {
            llSay(0, (string)i); // gibt den aktuellen index Wert zurueck.
            i++; // index counter innerhalb der Schleife.
        }
        while(i < limit);
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}

while

  • Die while Schleife sieht im Grunde genaus so aus wie die do while Schleife.
  • Sie unterscheidet sich lediglich darin, das die while Anweisung gleich am Anfang steht und das do fehlt.
  • Wie in der for Schleife, steht auch hier hinter der Anweisung kein Semikolon.
while Schleife alternative Methode
key owner;

integer limit = 10; // limit

default
{
    state_entry()
    {
        owner = llGetOwner();
        llSetObjectName("Schleife 03 " + llKey2Name(owner));
    }

    touch_start(integer total_number)
    {
        integer i = 0; // index
        
        // dieses mal steht die while Anweisung mit counter am Anfang
        while(++i < limit)
        {
            llSay(0, (string)i); // gibt den aktuellen index Wert zurueck.
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}
key owner;

integer limit = 10; // limit

default
{
    state_entry()
    {
        owner = llGetOwner();
        llSetObjectName("Schleife 03b " + llKey2Name(owner));
    }

    touch_start(integer total_number)
    {
        integer i = 0; // index
        
        while(i < limit)
        {
            llSay(0, (string)i); // gibt den aktuellen index Wert zurueck.
            i++; // der index erhoeht sich bei jedem Durchgang um 1.
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}