Popis JavaScriptů použitých v objektu Houpacka a Tlacitko


Pokud hledáte uživatelský návod, jak pracovat s houpačkou, najdete ho zde .

Houpačka:

DEF TRUE_TO_TIME Script {
    eventIn SFBool set_bool
    eventOut SFTime truetime
    url "javascript:
        function set_bool (value, time)
            { if (value)
                truetime=time;
            }
        "
}

    Pouze převede událost typu SFBool s hodnotou true na událost typu SFTime s aktuálním časem. Používá se k aktivování zvukového efektu při ručním otáčení poutačem.



DEF SERVICE_ZVUK_TIME Script {
    eventIn SFFloat    set_fraction
    eventOut SFTime zvuktime
    field SFFloat min_fraction 1
    url "javascript:
        function set_fraction (value, time)
            { if (value<min_fraction || (min_fraction<=0.9 && value>0.9))
                zvuktime=time;
              min_fraction=value;
            }
        "
}

     Aktivuje zvukový efekt v určitých fázích průběhu animace řízené časovým senzorem. Efekt je aktivován na počátku a v 90% trvání animace.



DEF NEGACE Script {
    eventIn SFBool set_bool
    eventOut SFBool negace_out
    url "javascript:
        function set_bool (value)
            {
                negace_out = !value;
            }
        "
}

    Vygenerování události nesoucí opačnou boolovskou hodnotu, než událost příchozí. Používá se pro deaktivaci cylindrického manipulátoru v případě automatického pohybu houpačky.



DEF SET_CYL_SEN_RIGHT Script {
    eventIn SFBool isActive
    field SFNode cyl_sen USE CYL_HOUP_SEN
    field SFNode houpatko USE HOUPATKO
    url "javascript:
        function isActive (value)
            {
                if(isActive)
                    {
                        cyl_sen.offset = houpatko.rotation[3];
                    }
            }
        "
}

    Použit pro nastavení výchozí rotace cylindrického manipulátoru po skončení automatického pohybu.



DEF SERVICE_LOGIC Script {
    eventIn SFTime service
    eventIn    SFTime customer
    field SFNode timesensor USE    TIMESENSOR
    field SFNode fail_zvuk USE FAIL_ZVUK
    field SFNode ok_zvuk USE OK_ZVUK
    url "javascript:
        function service (value,time)
            {
                if(!timesensor.isActive)
                    {
                        timesensor.startTime=-1;
                        timesensor.stopTime=0;
                        timesensor.loop=true;
                        ok_zvuk.startTime=time;
                    }
                else
                    fail_zvuk.startTime=time;
            }
        function customer (value,time)
            {
                if(!timesensor.isActive)
                    {
                        timesensor.loop=false;
                        ok_zvuk.startTime=time;
                    }
                else
                    fail_zvuk.startTime=time;
            }
        "
}

    Slouží ke zpracování událostí o stisku tlačítek Customer mode a Service mode na servisním panelu. V případě, že probíhá automatický pohyb houpačky, nelze tyto tlačítka stisknout. V případě stisknutí tlačítka Service mode navíc vyresetuje hodnoty v časovém senzoru, aby nedošlo k nechtěnému rozběhnutí pohybu houpačky v případě, že byla zastavena uplynutím 4 zaplacených houpnutí. Také zajišťuje vygenerování příslušných zvuků.



DEF HOUP_ORIENT Script {
    eventIn    SFTime starttime
    field SFNode houpatko USE HOUPATKO
    field SFFloat casrozbehu 0
    eventIn SFFloat    set_fraction
    eventOut SFRotation    value_changed
    eventOut SFTime    rozbehnise
    field SFFloat min_fraction 1
    eventOut SFTime    zvuktime
    url "javascript:
        function set_fraction (value, time)
            {
                //zvuky mechanismu
                if (value<min_fraction || (min_fraction<=.125 && value>.125) || (min_fraction<=.25 && value>.25)
                 || (min_fraction<=.375 && value>.375) || (min_fraction<=.5 && value>.5) || (min_fraction<=.625 && value>.625)
                  || (min_fraction<=.75 && value>.75) || (min_fraction<=.875 && value>.875))
                    zvuktime=time;
                min_fraction=value;

                //houpani
                if(value >= casrozbehu)
                    {
                    value_changed = new SFRotation (0, 1, 0, -1.57-.3*Math.sin(8*(value-1/16)*Math.PI));
                    casrozbehu=0;
                    }
            }
        function starttime (value)
            {
                casrozbehu = Math.asin(-(houpatko.rotation[3]+1.57)/0.301)/(8*Math.PI)+1/16;
                rozbehnise = value+1;
            }
        "
}

    Tento složitější skript zajišťuje korektní chování houpací části houpačky i v případě, že je postupně ovládána automaticky či ručně. Skript nejprve dostane událost starttime od mincovníku, na kterou reaguje tak, že nastaví startovní polohu pro počátek pohybu houpačky casrozbehu a nastaví samotný čas pro aktivaci timesensoru pohybu na aktuální čas + 1 sekunda. V set_fraction dostává časová data od timesensoru pohybu houpačky a v value_changed generuje sinusový rotační pohyb. Zároveň ve zvuktime generuje události pro přehrávání zvuku mechanismu houpačky.




Tlačítko:

DEF SCR_TL Script {
eventIn SFTime touchtime

eventOut SFBool    ison IS    state
eventOut SFBool    invertison IS invertstate
eventOut SFInt32 intison IS    intstate
eventOut SFInt32 invertintison IS invertintstate

field SFBool stav TRUE
field SFNode timesensor USE    TIME

field SFNode interponoff USE ROTATION_ON_TO_OFF
field SFNode interpoffon USE ROTATION_OFF_TO_ON
field SFNode transf USE    TRANSF
url "javascript:
    function touchtime (value)
        {
        if(timesensor.isActive)
            return;
        if(stav)
            {
            stav=false;
            Browser.deleteRoute(timesensor,'fraction_changed',interpoffon,'set_fraction');
            Browser.deleteRoute(interpoffon,'value_changed',transf,'rotation');
            Browser.addRoute(timesensor,'fraction_changed',interponoff,'set_fraction');
            Browser.addRoute(interponoff,'value_changed',transf,'rotation');
            }
        else
            {
            stav=true;
            Browser.deleteRoute(timesensor,'fraction_changed',interponoff,'set_fraction');
            Browser.deleteRoute(interponoff,'value_changed',transf,'rotation');
            Browser.addRoute(timesensor,'fraction_changed',interpoffon,'set_fraction');
            Browser.addRoute(interpoffon,'value_changed',transf,'rotation');
            }
        ison=stav;
        invertison=!stav;
        if(stav)
            {
            intison=1;
            invertintison=0;
            }
        else
            {
            intison=0;
            invertintison=1;
            }
        timesensor.startTime=value;
        }
    "
}


    Tento skript zajišťuje správné fungování celého tlačítka. V touchtime přijme čas stisku tlačítka. Pokud právě probíhá animace tlačítka po předchozím stisku, aktuální stisk se ignoruje. V opačném případě se podle aktuálního stavu tlačítka nastaví stav nový a provede se proroutování uzlů interpolátorů rotace tak, aby se provedl požadovaný pohyb. Vygenerují se výstupní události různých typů informující o novém stavu tlačítka a nakonec se aktivuje timesensor pro provedení animace tlačítka.



DEF BOOL_TO_INT Script {
    eventIn SFBool set_bool
    eventOut SFInt32 integer
    url "javascript:
        function set_bool (value)
            {
                if(value)
                    integer=1;
                else
                    integer=0;
            }
        "
}

    Pracuje jako konvertor hodnoty typu SFBool na SFInt32. Používá se pro zobrazení textu u tlačítka v případě, že je nad ním kurzor myši.


Filip Vůjtěch, 16.12.2002