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