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

Scripten Lernen (Deutsch)

Wer hat Interesse, Scripte zu verstehen?


  • Umfrageteilnehmer
    19
  • Umfrage geschlossen .

Yara Eilde

Superstar
Ich habe voller Verzweiflung heute auf der Testsim gestanden und wollte mein Animesh auch zum Tanzen bringen. Er stand stocksteif da und ich zweifelte an meinen kaum vorhandenen Scriptkenntnissen. Bis Natascha mir den Hinweis gab das man das Animesh mit rechts anklicken muss und dann Berühren. Und Tara... es tanzte.
Ein einfaches Klicken reicht nicht, aber ich hatte nicht dran gedacht.
 

Daemonika Nightfire

Forumsgott/göttin
huhu,

aus diesem Grund haben wir beim Script-Kurs einen einfachen Prim Wuerfel als Root angelinkt, damit es einfach mit linker Maustaste klickbar ist.

LG
Dae
 

Daemonika Nightfire

Forumsgott/göttin
huhu ihr suessen,

im vergangenen Kurs haben wir uns ausschliesslich mit AniMesh beschaeftigt.
Beim aktuellen Script verwenden wir 2 Animationen.
Bei der ersten Animation handelt es sich um eine Stand-Ani, welche die ganze Zeit abgespielt wird.
Die zweite Animation ist lediglich eine kurze Ani, die abgespielt wird, wenn jemand fremdes das AniMesh anklickt.

Hier nun das aktuelle Script:
Code:
key owner; // Besitzer-Key
integer Schalter = FALSE; // Globale Variable fuer den Schalter (Status aus).
string Animation = ""; // Global angelegter Name fuer die Animation.
string Anim2 = "dz427-Jump.N"; // Global angelegter Name fuer eine zweite Animation.

default
{
    state_entry() // Eingang, wird bei jedem Reset oder Speichern ausgefuehrt.
    {
        owner = llGetOwner();
        if(llGetInventoryNumber(INVENTORY_ANIMATION) > 0) // Abfrage ob mehr als keine Animation im Objekt liegt.
        {
            // Setzt hier den Namen der ersten Animation in die globale Variable ein.
            Animation = "*DS* male stand3"; //llGetInventoryName(INVENTORY_ANIMATION,0);
        }
    }

    touch_start(integer total_number) // Wird beim klicken ausgefuehrt
    {
        key avatar = llDetectedKey(0); // Erkennt den Key desjenigen der klickt
        if(avatar == owner) // Vergleicht den key mit dem Besitzer
        {
            if(Animation != "") // Prueft ob ein Name in der globalen Variable eingetragen ist.
            {
                if(Schalter == FALSE) // prueft Schalter ( Status aus? )
                {
                    Schalter = TRUE; // setzt den Status des Schalters auf an.
                    llStartObjectAnimation(Animation); // Startet die Animation im AniMesh.
                }
                else if(Schalter == TRUE) // prueft Schalter ( Status an? )
                {
                    Schalter = FALSE; // setzt den Status des Schalters auf aus.
                    llStopObjectAnimation(Animation); // Stopt die Animation im AniMesh.
                }
            }
        }
        else if(avatar != owner) // Vergleicht den key mit dem Besitzer
        {
            llSay(0, "Pfoten weg du Ferkel");
            llStartObjectAnimation(Anim2); // Startet die Animation im AniMesh.
            llSetTimerEvent(2); // Startet einen 2 Secunden Timer fuer die ungefaehre Dauer der zweiten Animation.
        }
    }
   
    timer()
    {
        llSetTimerEvent(0); // Stoppt den Timer wieder
        llStopObjectAnimation(Anim2); // Stopt die Animation im AniMesh.
    }
   
    changed(integer ch) // Wird immer ausgefuehrt, wenn sich am Object irgend etwas aendert.
    {
        if(ch & CHANGED_INVENTORY) // Prueft ob sich der Inhalt des Objects aendert.
        {
            llResetScript(); // resettet das Script.
        }
    }
   
    on_rez(integer Dae) // Wird immer ausgefuehrt, wenn das Object gerezzt wird, auch als Attachment.
    {
        llResetScript(); // resettet das Script.
    }
}

Wer das Script und die hier verwendeten Animationen haben moechte, kann sich den Deadpool 2 in der Script Schule kopieren.

Nun aber zum kommenden Kurs.
Jetzt wird es absolut Fortgeschritten, dennoch moechte ich nicht, das sich Anfaenger nun abgeschreckt fuehlen.

Weil wir im Kurs noch nicht so Umfangreiche und erst recht nicht so komplexe Scripte geschrieben haben, werde ich das Script vorbereiten und wir gehen es inhaltlich Schitt fuer Schitt durch, weil ich weiss das wir das definitiv nicht in 2 Stunden geschrieben bekommen.

Aktuell belegt das Script 308 Zeilen Script Code doch ich bin noch nicht ganz fertig.
Mal sehen, vielleicht wird es auch wieder etwas weniger. ;)

Der naechste Kurs findet am Sonntag den 20.01.2019 um 20 Uhr auf Bay of Surreality statt.

LG
Dae
 

Daemonika Nightfire

Forumsgott/göttin
Zwischenstand

huhu,

langsam nimmt es Formen an, bis jetzt bin ich bei 274 Zeilen Script Code.

Bei dieser Gelegenheit moechte ich eindringlich davon abraten, die Scripte der Freebies die man auf den Animesh Regionen bekommt, in eigenen Objecten zu verwenden.
Zu diesem Schluss bin ich gekommen, als ich saemtliche Funktionen der Scripte zerlegt habe.
Ja zerlegen kann man sagen, ich habe vieles verschrottet. ;)

Fazit:
Die Scripte Funktionieren, aber das war es auch schon.
Im grossen Ganzen sind die Scripte total unuebersichtlich und beinhalten einiges totes Material, was die Scripte nur unnoetig aufblaeht.

Zudem habe ich festgestellt, das AniMesh nicht gleich AniMesh ist.
Wie bei Vehiclen (Motoraeder / Autos & Co) ist der Aufwand fuer jedes AniMesh individuell.
Das heisst, man kann zwar die Scripte in eigene Objecte kopieren, doch wuerde das Ergebniss mit hoher Wahrscheinlichkeit ehr suboptimal.
Genauer gesagt, wie bei Fahrzeugen muss man die Scripte individuell auf jedes einzelne Object anpassen, wobei die Groesse ebenfalls eine Rolle spielt.

Unglaublich, aber man muss dem Script wirklich den Unterschied zwischen Mensch und Tier bei bringen.

Das war es erst einmal, bis zum naechsten mal.

LG
Dae
 

Daemonika Nightfire

Forumsgott/göttin
huhu ihr suessen,

fuer den naechsten Kurs plane ich erneut die Grundlagen fuer Anfaenger durch zu gehen.

Am kommenden Sonntag den 17.02.2019 um 20Uhr findet der Grundkurs fuer Anfaenger statt. (Voice hoeren erforderlich)
Damit zwischendurch Neueinsteiger dazu stossen koennen und sich nicht verloren vor kommen, werden wir diesen Kurs von Zeit zu Zeit wiederholen.

Natuerlich sind wieder alle eingeladen, auch jene die eine Auffrischung moechten. ;)
SLURL: Script-Schule auf Bay of Surreality

LG
Dae
 

Daemonika Nightfire

Forumsgott/göttin
huhu ihr suessen,

kommenden Sonntag den 03.03.2019 um 20 Uhr auf Bay of Surreality ist es wieder so weit.
Fuer den naechsten Kurs habe ich mir etwas neues ausgedacht, naemlich das ihr euch das Lernmaterial schon vorab ansehen koennt.
Zu diesem Zweck habe ich extra eine neue Seite in der SL-Wiki veroeffentlicht: Schalter

Eigentlich ist der Schalter die Grundlage fuer all unsere Scripte.
Ihr werdet euch wundern, wie oft wir einen Schalter schreiben und es nicht mal merken.
Ich bin davon ueberzeugt, das der ein oder andere nach diesem Kurs wieder einen Aha-Moment hat. ;)

LG
Dae
 

Daemonika Nightfire

Forumsgott/göttin
llResetScript();

Kleiner Befehl, grosse Wirkung.
Was macht dieser Befehl eigentlich?
Ich meine, man kann ja auch uebers Baumenue resetten, oder das Script oeffnen und auf Zuruecksetzen druecken.
Manchen wird es vielleicht auch schon aufgefallen sein, das ich diesen Befehl ganz gern im on_rez Event verwende.
Wenn ich das Inventar eines Objects neu auslesen moechte, verwende ich diesen Befehl auch gern mal im Changed Event, wenn ich den Inhalt veraendere.

Ich unterscheide immer zwischen Soft-Reset und Hard-Reset.
Jeder Reset der nicht mit Hilfe dieses Befehls ausgefuehrt wird, verstehe ich als Hard-Reset.
Bei einem Hard-Reset wird das Script so gesehen mit Brachial-Gewalt zurueck gesetzt.

Der Soft-Reset mittels llResetScript kann nur durchgefuehrt werden, wenn das Script noch irgendwie funktionsfaehig ist.
Wird nun ein Script mittels Script Fehler Stack Heap Collision angehalten, bleibt nur noch Hard-Reset oder wegschmeissen, wenn das Object und das Script no mod ist.

OK, was passiert denn nun eigentlich genau?
  • Saemtliche temporaeren Daten gehen in diesem Augenblick verloren.
  • Saemtliche veraenderten Variablen werden auf die gespeicherte Version zurueck gesetzt.
  • Alle globalen Variablen (falls vorhanden) werden komplett neu eingelesen.
  • Der State default wird als aktiver State gesetzt (falls man im andern State haengt, nuetzlich)
  • Ist der Event State-Entry vorhanden, werden alle Befehle darin augenblicklich ausgefuehrt.

Dann gibt es noch den llResetOtherScript("name des gewuenschten Scripts im Objekt");
Wichtig, das Script was hier resettet werden soll, muss im Object bei dem Script liegen, von wo aus dieser Befehl ausgefuehrt wird.
Der Name kann nicht das Script sein welches den Befehl ausfuehren soll.

Ich hoffe ich konnte mit dieser Erklaerung helfen zu verstehen, das ein Reset als Schleife fuer Script-Wiederholungen ungeeignet ist.
Falls es zu diesen beiden Befehlen hier noch Fragen gibt, duerfen sie gerne hier diskutiert werden. :)

LG
Dae
 

Wolwaner Jervil

Freund/in des Forums
Danke mal für die Info, 9.6. wird sich nicht ausgehen (entweder DJ oder Geburtstagsfeier). Ich melde mich Inworld zwischendurch.
 

Daemonika Nightfire

Forumsgott/göttin
Guten morgen,

in den vergangenen Tagen habe ich meinen Schwerpunkt auf die SL-Wiki gelegt und dort das ein oder andere Wiki-Example erstellt.
In diesem Zusammenhang habe ich mich dann daran gesetzt, auf meiner User-Page die Tutorials fuer die Script-Schule (deutsch) zusammen zu fassen.

Das ein oder andere muss ich noch ergaenzen und manches aendere ich vielleicht wieder, doch im Grunde laesst sich schon erkennen in welche Richtung es geht.
Eines moechte ich jedoch noch klar stellen, ich moechte nicht die komplette Wiki neu schreiben oder gar uebersetzen, auf meiner User-Page geht es lediglich darum den Inworld Script Kurs zentral zusammen zu fassen.

Mit dem folgenden Link landet ihr direkt auf meiner User-Page, wo ich auch die Termine fuer die naechsten Kurse aktuell halten moechte: https://wiki.secondlife.com/wiki/User:Daemonika_Nightfire#Script_Schule_.28deutsch.29

Ich weiss, manche tun sich etwas schwer, eine saubere Formatierung einzuhalten und verlieren darum schnell den Ueberblick.
Auf der folgenden Seite habe ich mal die Grundlagen und den modularen Aufbau eines Scriptes mit einem Aktenschrank verglichen, um ein besseres Verstaendniss fuer Formatierung und Event-Platzierung zu erzeugen.
Ich hoffe das hilft Anfaengern einen besseren Einstieg zu finden: https://wiki.secondlife.com/wiki/User:Daemonika_Nightfire/Scripts/Grundlagen

Natuerlich kann auch weiterhin hier im Thread diskutiert und Fragen gestellt werden.

LG
Dae
 

Daemonika Nightfire

Forumsgott/göttin
Tilde ~

huhu,

im gestrigen Kurs habe ich versprochen, das ich mich mal mit der boesen Tilde beschaeftige.
Wie wir wissen tun sich viele mit diesem Zeichen etwas schwer und genau so schwer tuhe ich mich diese zu erklaeren.

Aber ich habe mal ein wenig recherchiert und folgendes gefunden:
https://de.wikipedia.org/wiki/Bitweiser_Operator
Ein bitweises NICHT oder Komplement ist eine einstellige Verknüpfung, die eine logische Negation jedes Bits durchführt und damit das Einerkomplement einer Binärzahl bildet. Jede 0 wird durch eine 1 ausgetauscht und umgekehrt.
Beispiel: NICHT 0111 = 1000

Die eigentliche Frage im Kurs war nun, warum ich die Tilde in einer if vor dem llListFindList verwende.
In diesem Fall muessen wir ein wenig um die Ecke denken.

Normalerweise verwenden wir den Befehl llListFindList um den index (Stellenwert) eines Listeneintrages festzustellen.
Nun gehe ich aber gern hin und trage den Befehl direkt in eine if ein, ohne den index zu ermitteln, wenn mich lediglich interessiert, ob der gesuchte Wert ueberhaupt vorhanden ist.

Dazu nutze ich dann die Tilde.
Diese Tilde kehrt die eigentliche Fragestellung nun ins Gegenteil um, je nachdem welches Ergebnis geliefert wurde.
Wenn wir nun die Antwort auf unsere Frage Sinngemaess auf TRUE und FALSE (1 & 0) runter brechen, kommen wir genau dahin was die Tilde macht.

Wie oben schon erwaehnt, kehrt die Tilde jede 1 zur 0 um und umgekehrt.
Nun lautet meine Frage in der if so if(~llListFindList(list...) und ergibt folgendes:
if(nicht FALSE llListFindList(list...) wenn der Wert TRUE ergibt, also vorhanden ist.
Wenn der Wert nun nicht in der Liste vorhanden ist, erhalten wir FALSE und die Frage lautet automatisch if(nicht TRUE llListFindList(list...)
Das bedeutet nun Sinngemaess, wenn die Tilde in der if ein nicht FALSE zurueck gibt, bedeutet das ein JA fuer die gesamte if und alles weitere darin wird ausgefuehrt.

Ich hoffe ich konnte das nun mit ganz einfachen Worten ohne Fach-Chinesisch verstaentlich genug rueber bringen.

LG
Dae

Weiterfuehrende Information zu diesem Thema duefen hier gerne angehaengt werden.
 
Zuletzt bearbeitet:

Bartholomew Gallacher

Freund/in des Forums
Man könnte auch mit if (llListFindList(liste, suchelement) = -1) then auf Nichtexistenz prüfen. Das ist was länger zu schreiben, aber auch einfacher verständlich.

Warum aber nehmen dann erfahrene Skripter wie Daemonika lieber gleich die Tilde? Es ermöglicht als netten Nebeneffekt kompakteren Code, aber benötigt zudem auch weniger Bytecode beim Speichern des Skripts und weniger Rechenleistung während der Ausführung im Vergleich zum logischen Operator = -1. Es dient also der Skriptoptimierung.
 
Hättest Du Zeit, Muße und Lust so einen Script-Anfänger Kurs noch einmal anzubieten in naher Zukunft?
Ach ich sehe gerade, der läuft sogar heute... leider zu spät gesehen.
Ich werde mir das Video dazu mal ansehen
 
Zuletzt bearbeitet:

Daemonika Nightfire

Forumsgott/göttin
Vorankuendigung

huhu,

der ein oder andere von euch hat bestimmt schon den Particle Editor des Firestorm entdeckt.
Wer ihn noch nicht kennt, hier ist er:
Neuen Prim rezzen und mit dem Baumenue selektieren...
Im Viewer Menue "Bauen" in "Objekt" auf "Partikel editieren" klicken...
Dabei oeffnet sich ein neues Fenster, wo ihr nach Lust und Laune saemtliche Effekte ausprobieren koennt.

particle editor.png

Sobald euch ein Effekt gefaellt, klickt einfach auf dem Button Injizieren im besagten Fenster.
Damit wird im selektierten Prim automatisch ein neues Script erzeugt.
Das Script sieht dann so aus:

particle script.jpg

Erst jetzt kann jeder euren Effekt auch sehen, vorher wurde der nur fuer euch generiert.
Alles in allem ein recht praktisches Tool, wenn man mal auf die Schnelle ein einfaches ParticleSystem braucht.

Wenn man den Particle Effect mit der aktuellen konfiguration jetzt so gebrauchen kann, weil man ihn einfach so irgend wo aufstellen moechte, ist man hier fertig.
Man kann gegebenenfalls sogar das Script wieder raus loeschen, weil Particle sind Primitiv Parrameter und koennen nur per Script wieder geloescht werden.


Gut, wenn man den Effect nun in ein anderes Script uebertragen und mit einem ein/aus Schalter versehen, oder nachtraeglich etwas an den Werten veraendern moechte, steht der ein oder andere auf dem Schlauch.
Klar, man kann per Try & Error einfach mal die ein oder anderen Werte anpassen und bekommt irgend wann sogar das gewuenschte Ergebnis, doch es macht bestimmt viel mehr Spass, wenn man die Werte gezielt anpassen kann und nach kurzer Zeit fertig ist.

Ein ParticleSystem bietet auch mehr Moeglichkeiten, als der Particle Editor des Viewers.
Weiterhin schliessen sich manche Optionen gegenseitig aus, man kann zwar im Editor sehen das gewisse Optionen deaktiviert werden, wenn man den ein oder anderen Haken setzt, aber warum das so ist konnte ich nirgends finden.
Informationen worauf man achten und was man vermeiden sollte fehlt mir ebenfalls.

Aus diesem Grund ist das Thema des nachsten Kurses am Sonntag den 23.05.2021 um 20Uhr das ParticleSystem.
Zu diesem Zweck habe ich ein komplett neues ParticleSystem mit allen neuen Features erstellt und hinter den einzelnen Parametern kurze Erklaerungen geschrieben.

particle wiki.png

Das vollstaendige Script koennt ihr bereits in der Wiki finden:

Natuerlich werde ich das beim Kurs auch Free to Copy zur verfuegung stellen:

Bei Interesse, tut euch selbst einen Gefallen und schaut euch vor dem Kurs in den kommenden 2 Wochen das Script schon mal an und macht euch Gedanken dazu, denn ich bin mir nicht sicher, ob wir mit 2 Stunden Unterricht auskommen werden.

LG
Dae
 

Aktive User in diesem Thread

Oben Unten