DAE SKRIPT KURS 02.09.2018

Dynamisches LINK_SET

huhu ihr suessen,

zu aller erst moecht ich mich erwaehnen, das der Unterricht immer noch spass macht und fleissig mit gemacht wird.
Vielen Dank :)

Fuer alle die gestern Abend nicht dabei sein konnten habe ich hier das Script mit Erklaerungen.
Sollte es dazu Fragen geben, koennen die gern hier im Thread oder Inworld gestellt werden.

Gestern abend hatten wird das Dynamische LINK_SET. Das bedeutet wir muessen keine fixen Link_Nummern mehr vergeben damit das Script den richtigen Link findet.
Die Funktion die wir erstellt haben ist fuer alles moegliche anwendbar.
Als Globale Funktion koennen wir den Code auch aus jedem X-Beliebigen Event heraus abrufen, ohne alles noch mal schreiben/kopieren zu muessen.

Hier nun das Basic Script voellig ohne Kommentare und Schnik Schnak zwecks uebersicht:
In unserem Beispiel heisst der gesuchte Prim im Objectnamen kleingeschrieben test.


integer Gesuchte_Link_Nummer;
Suchen()
{
    integer Anzahl_Links = llGetNumberOfPrims();
    integer i = 1;
    
    do
    {
        string Link_Name = llGetLinkName(i);
        if(Link_Name == "test")
        {
            Gesuchte_Link_Nummer = i;
        }
    }
    while(++i <= Anzahl_Links);
}

default
{
    state_entry()
    {
        Suchen();
        llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" \nhat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
    }

    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            Suchen();
            llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" hat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
        }
    }
}



 Nun das selbe Script inclusive Erklaerungen der einzelnen Funktionen:
Das Script ist leserlicher, wenn ihr es Inworld in ein Script kopiert.


integer Gesuchte_Link_Nummer;   // leerer integer fuer unsere unbekannte Link_Nummer
Suchen()    // start unserer globalen Such-Funktion
{
    integer Anzahl_Links = llGetNumberOfPrims();    // Speicherort fuer die Gesamt_Anzahl Links im LINK_SET
    integer i = 1;  // Startpunkt fuer den Counter in der "do while" Schleife (0 waere Sinnlos, da ein LINK_SET mit mehr als 1 Link immer mit 1 beginnt)
    
    do  // Anfang der "do while" Schleife
    {
        string Link_Name = llGetLinkName(i); // Fragt den Namen des aktuell gewaehlten Links nach (i wird mit jedem Durchlauf um 1 erhoeht)
        if(Link_Name == "test") // Vergleicht den Link_Namen mit dem hier festgelegten Namen
        {
            Gesuchte_Link_Nummer = i;   // Fuellt die globale Variable mit der Link_Nummer (i) wenn der Name ueberein stimmt
        }
    }
    while(++i <= Anzahl_Links); // wiederholt hier den gesamten Vorgang, bis die letzte Link_Nummer erreicht wurde
}

default
{
    state_entry()   // loest aus, sobald das Script gespeichert oder resettet wird
    {
        Suchen();   // Startet die globale Such-Funktion (beachte das Semicolon am Ende)
        
        // Chat-Meldung zum ueberpruefen, ob das Script alles richtig macht
        llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" \nhat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
    }

    changed(integer change) // loest immer dann aus, wenn sich am Object irgend etwas aendert
    {
        if(change & CHANGED_LINK)   // loest nur dann aus, wenn sich das LINK_SET aendert ( Link hinzufuegen, entfehrnen oder drauf setzen)
        {
            Suchen();   // Startet die globale Such-Funktion (beachte das Semicolon am Ende)
            
            // Chat-Meldung zum ueberpruefen, ob das Script alles richtig macht
            llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" hat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
        }
    }
}

Nun wollten wir nicht nur eine bloede Chat-Meldung, sondern auch sehen das es funktioniert wie es soll.
Zu diesem Zweck haben wird den Touch Event mit einem Schalter hinzugefuegt.

Wenn wir nun das Object anklicken, wird genau der eine Link namens test eingefaerbt.
Dazu haben wir im Befehl llSetLinkColor keine Link_Nummer angegeben, sondern den Namen der globalen Variable, welcher fuer die Link_Nummer steht.

Das Script mit Touch event, aber wieder ohne Kommentare:
Code:
integer Schalter = 0;

integer Gesuchte_Link_Nummer;
Suchen()
{
    integer Anzahl_Links = llGetNumberOfPrims();
    integer i = 1;
    
    do
    {
        string Link_Name = llGetLinkName(i);
        if(Link_Name == "test")
        {
            Gesuchte_Link_Nummer = i;
        }
    }
    while(++i <= Anzahl_Links);
}

default
{
    state_entry()
    {
        Suchen();
        llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" \nhat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
        
        llSetLinkColor(Gesuchte_Link_Nummer, <1,0,0>, ALL_SIDES);
    }
    
    touch_start(integer NumberOfTouches)
    {
        if(Schalter == 0)
        {
            Schalter = 1;
            llSetLinkColor(Gesuchte_Link_Nummer, <0,1,0>, ALL_SIDES);
        }
        else if(Schalter == 1)
        {
            Schalter = 0;
            llSetLinkColor(Gesuchte_Link_Nummer, <1,0,0>, ALL_SIDES);
        }
    }

    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            Suchen();
            llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" hat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
        }
    }
}

Natuerlich kann man die Funktion beliebig erweitern oder eine andere Schleife als die "do while" verwenden.
Doch ich finde die "do while" Schleife im Anfaenger-Kurs deutlich einfacher und uebersichtlicher als die "for" Schleife.

In diesem sinne bedanke ich mich das alle fleissig mit gemacht haben und wuensch allen bei allen weiteren Kursen viel Spass.
Bis zum naechsten mal in 2 Wochen.

LG
Dae
 
 
 
ANMERK :  Liebe DAE  wir danken dir  für deine  Geduld und das du uns dein Wissen weitergibst!
 

Kommentare