1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
    Information ausblenden
  3. 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.
    Information ausblenden

Warum macht man so etwas?

Dieses Thema im Forum "Fragen zu Scripting" wurde erstellt von Daemonika Nightfire, 22. August 2014.

  1. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.218
    Zustimmungen:
    148
    Punkte für Erfolge:
    63
    hi,

    im folgenden Beispiel handelt es sich lediglich um einen simplen Lichtschalter der eigentlich nichts anderes macht als eine Kerze an und aus zu schalten.
    Code:
    //globale variable:
    integer giLighted = TRUE;
    
    //--------------------------
    
        touch_start(integer iNumberTouching)
        {
            integer i = 0;
            do
            {
                if(giLighted)
                {
                    Smoke();
                    giLighted = FALSE;                                    
                }
                else
                {
                    Flame();
                    giLighted = TRUE;                                     
                }
                ++i;
            }
            while (i < iNumberTouching);
        }
    Ich verstehe den Sinn dieser Schleife nicht!

    Wenn ich einen Schalter erstelle, sieht das folgendermassen aus:
    Code:
    //globale variable:
    integer status = FALSE; 
    
    //--------------------------
    
        touch_start(integer num)
        {
            if(status == TRUE)
            {
                status = FALSE;
                Smoke();                                  
            }
            else if(status == FALSE)
            {
                status = TRUE;
                Flame();                                   
            }
        }
    Was sagt ihr dazu?

    LG
    Dae
     
  2. Nicoletta Schnute

    Nicoletta Schnute Forumsgott/göttin

    Beiträge:
    8.042
    Zustimmungen:
    717
    Punkte für Erfolge:
    123
    Ich verstehe es auch nicht dafür eine Schleife zu erstellen *schulterzuck*
     
  3. Jan Hird

    Jan Hird Aktiver Nutzer

    Beiträge:
    363
    Zustimmungen:
    99
    Punkte für Erfolge:
    28
    Rein theoretisch gibt es die Möglichkeit das ein Event mehrere touch_starts verarbeitet. Das Zeitfenster in dem
    verschiedene Avatare den Prim klicken können ist allerdings ziemlich klein, wenn es den überhaupt besteht.
    Ich hab 2007/08 mal versucht mit mehrenen Avas nen Event mit mehreren Touch_starts zu erzeugen. Ist mir
    damals nicht gelungen. Ergo kann man für alle normalen Anwendungen num getrost ignorieren.

    Und wenn es dann in 100 Jahren einmal vorkommt das ein touch verloren geht, das kann man auf den
    Hardwarehersteller der Maus schieben oder auf Merkel :D

    bis denne
    Jan
     
  4. Archon Short

    Archon Short Administrator Mitarbeiter

    Beiträge:
    5.150
    Zustimmungen:
    731
    Punkte für Erfolge:
    124
    In dem speziellen Fall ist es völlig sinnlos.

    Ich hatte mal ein Spiel gebastelt, bei dem die drei ersten Toucher ins Folgespiel eingeladen wurden, da hatte ich sowas auch genutzt, aber später auch wieder gelöscht, da die Funktion selbst ziemlich schnell auch mit (0) eine Liste mit 3 Keys erstellt.
     
  5. Shirley Iuga

    Shirley Iuga Forumsgott/göttin

    Beiträge:
    7.507
    Zustimmungen:
    2
    Punkte für Erfolge:
    36
    touch_start(integer iNumberTouching) kann wie schon erwähnt mehrere gleichzeitige Berührungen erkennen.

    Das liegt daran, dass Scripts nicht kontinuierlich arbeiten, sondern immer in Intervallen von wenigen Mikrosekunden. Der Server läuft mit 45 FPS und pro Frame und Script können nicht mehr als 2 Events abgearbeitet werden, meist wird aber nur 1 Event verarbeitet. So dass man eben meist oft 1/45s = 22ms Zwischen den Event-Ticks hat. (Deswegen machen Timer mit weniger als 0.02 oder 0.01 Sekunden auch keinen Sinn in SL...) Kommen dann zwischen zwei dieser Event-Intervalle eben mehrere gleichzeitige touches rein, dann kann es also auch mal sein, dass z.B. in einem Club mit 30+ Leuten plötzlich 2+Toucher registiert werden. Wenn sie es zufällig schaffen gleichzeitig innerhalb von 22ms zu klicken. Das Problem daran ist: So ein Ereignis bewusst herbei zu führen dürfte nicht ganz einfach sein, nicht zuletzt weil eben jeder User eine andere Latenz zum Server hat, von 10ms wenn man direkt in der Nähe sitzt bis über 250ms wenn man in Europa sitzt. Und leider gibt es wohl keine Möglichkeit diese User-Server Latenz per LSL-Script zu messen um das irgendwie auszugleichen. (Es gibt keinen "Ping" in LSL).

    Bei deinem unteren Schalter wird die Kerze in diesem Fall jedenfalls einfach an oder aus geschaltet, egal wie viele "gleichzeitig" in diesem Tick den Schalter drücken. Bei der Schleife oben wird jeder Touch innerhalb des Ticks ausgewertet um an oder aus zu schalten. Bei einer Kerze macht das natürlich wenig Sinn, mit der Schleife und mehreren Touchern flackert die Kerze wohl bisschen. Und eventuell tut sich bei einem Doppeltouch auch überhaupt nichts, weil die Kerze aus ist ehe die entsprechenden Funktionen für Rauch und Leuchten abgearbeitet wurden..Scripte Ticken wie gesagt.
    Hier ist die Schleife sogar kontraproduktiv - beide wollen ja die Kerze an/aus schalten beim Klicken.

    Möchte man aber z.B. keine Kerze schalten, sondern den Touch irgendwie anders verarbeiten (etwa Klick=Damage in einem schnellen Spiel oder ähnlichem), dann macht so eine Konstruktion mit Schleife, die wirklich jeden Touch auswertet, eventuell Sinn. Und ist zumindest "sauber" programmiert, weil damit keine Touch-Ereignisse unter den Tisch fallen. Und ich vermute einfach mal, dass da per Copy&Paste irgendwelcher vorhandene Code in die Kerze eingebaut worden war.
     
  6. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.218
    Zustimmungen:
    148
    Punkte für Erfolge:
    63
    Vielen Dank,

    das habe ich mir auch schon gedacht, das es fuer so eine Funktion Anwendungsgebiete geben mag, wobei mir allerdings nichts dazu einfiel, wo das noetig waere.
    Fuer eine Kerze, die man nur an/aus schalten will, halte ich das allerdings auch fuer quatsch.

    Und Shirley, du hast richtig vermutet, diese Funktion stammt tatsaechlich aus einem copy/paste Konstrukt, bei dem es im Zusammenhang mit einem llSleep und einem zweiten Script regelmaessig gesponnen hatte.

    Nachtrag:
    Copy/paste Scripte kann man gaaaanz leicht daran erkennen, wenn man den ganzen Code selektiert. Wenn dann hinter den Befehlen Ellen lange Leerschritte auftauchen, kann man zu ueber 90% davon ausgehen, das es von irgend einer dubiosen Webseite stammt.
    Ebenfalls verraeterisch sind die wechselnden Formate bzw. unterschiedlichen Schreibstiele innerhalb eines Scripts.

    LG
    Dae
     
    Zuletzt bearbeitet: 23. August 2014