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

Doppelklick erkennen.

Johanna Burnstein

Freund/in des Forums
Mahlzeit,

Ich hab schon öfters Objekte/Scripte gesehen die auf einen Doppelklick reagiert haben.
Nun hab ich mich gefragt: "Wie machen die das?"
Auswerten des an touch (und/oder touch_start) übergebenen Parameter kann es ja nicht sein, oder? (Da kann man so wild auf das Objekt klicken wie man will, man wird immer einen Event pro Klick erzeugen.)

Jetzt ist mir eine Lösung per Timer eingefallen. Sähe grob so aus:
Code:
float DBLCLK_TIMEOUT = 0.3; // timeout to detect double clicks
integer g_bDoubleClick = FALSE; // global flag, true if we're waiting for a second click

default
{
    state_entry() {
    }

    touch_start(integer nAgents) {
        if(g_bDoubleClick) {
            // clear double click timeout
            // to prevent multiple (>2) clicks beeing processed too
            g_bDoubleClick = FALSE;
            llSetTimerEvent(0.0);
            // * act on double click *
            llOwnerSay("Double Click");
        } else {
            // start double click timeout
            g_bDoubleClick = TRUE;
            llSetTimerEvent(DBLCLK_TIMEOUT);
        }
    }

    timer() {
        // clear double click timeout
        g_bDoubleClick = FALSE;
        llSetTimerEvent(0.0);
        // * act on normal click *
        llOwnerSay("Normal Click");
    }
}


Das funktioniert auch ganz gut. Nur frage ich mich aber ob es noch andere Techniken gibt und wie die aussähen.

Gruß,
Jo'
 
vieleicht hilft dir das weiter...
...der Prim reagiert jetzt ausschliesslich auf doppelklick.
Code:
integer unixtime;
default
{
    state_entry()
    {
        llSay(0, "Hello, Avatar!");
    }
    touch_end(integer total_number)
    {
        if(llDetectedKey(0) == llGetOwner())
        {
            unixtime = llGetUnixTime();
        }
    }
    touch_start(integer total_number)
    {
        if(llDetectedKey(0) == llGetOwner())
        {
            if((llGetUnixTime() - unixtime) < 1)
            {
                llSay(0, "doppelklick");
            }
        }
    }
}
 
Habs dann mal noch nen Stück kürzer.

Code:
default
{
    touch_start(integer total_number)
    {
        if(llGetAndResetTime() < .3)
        {
            llOwnerSay("doppelklick");
        }
    }
}


Gruß Simon
 
Danke euch beiden. Ich hab mal Simons Beitrag als besten genommen da er recht schlank daherkommt :)

touch_start und touch_end dafür zu benutzen ist aber auch nicht schlecht, falls man mal aus irgend einem Grund doch mal llGetTime braucht.

Gruß,
Jo'
 

Users who are viewing this thread

Zurück
Oben Unten