. .. : Swf.hu 1.0 archívum : Swf.hu főoldal >>> : .. .




 
 
SEGÉDLETEK ActionScript

setInterval - időzített függvény és metódushívás
  feltöltve: 2004.01.02 | szerző: berry | olvasva: 6891 alkalommal

 

Bizonyára mindenki találkozott már olyan esettel, amikor egy pár soros scriptet szeretett volna lefuttatni többször. Ezt remekül meg is lehet oldani pl. egy for ciklussal. De mi a helyzet, akkor, ha ezt az ismétlődést nem egy keyframe-ben szeretnénk végrehajtani, hanem kis fáziskésésekkel? Pl. egy kis anim, amit duplikálnánk néhányszor, de azt szeretnénk, hogy egy kis eltolódás legyen köztük.
No lássuk mit lehet ilyenkor tenni...



Ódivatú megoldás

Régebbi flash verzióknál (flash 5) ezt csak egy kis trükk segítségével lehetett megoldani. Pl.: kellett egy MC ami néhány frame hosszú volt, és az első frameben volt a duplikálás vagy az adott függvény. Mivel a movie clipek ismétlődnek, ezért annyiszor futtattuk le ezzel a kívánt kódsorokat, ahányszor csak akartuk. Léteztek egyéb alternatív megoldások is a dologra, de azok is ehhez valamilyen hasonló módszerek.


setInterval

A Flash MX-ben már van egy setInterval nevű függvény, amely a fenti esetekre is tökéletes megoldást nyújt. Ezzel a függvénnyel lehetőségünk van megadni egy saját magunk által deklarált függvényt, vagy egy objektum metódusát és azt, hogy milyen időközönként fusson az le. A függvény külön érdekessége, hogy nem függ a movie FPS beállításától. Az intervallum idejét miliszekundumban kell megadni. Ezzel akár egy (az FPSnél) gyakoribb végrahajtást is elérhetünk, csupán az updateAfterEvent() függvényt kell meghívnunk, hogy a movie grafikai részei is frissüljenek, ha szükséges.

Nézzünk egy nagyon egyszerű példát! Nyiss egy üres movie-t, és gépeld be a kovetkezőt:

function myTrace() {
     trace(i++);
}
var i=0;
setInterval(myTrace, 1000);


Most nézzed meg mi történik, ha teszteled a movie-t!
Láthatod, hogy a myTrace függvény másodpecenként végrehajtja a benne lévő trace(i++) utasítást, mely kiirja az i értékét, és növeli azt egyel.


Processzor terheltségi problémák

Bizony a flash eléggé lenyúlja a szabad processzoridőt, főleg, ha néhány onEnterFrame eseménykezelőhöz rendeltünk valamilyen kódot. Például egy óra működtetését is így szokták megoldani. Viszont ez feleslegesen fogja a kliensgépet. Erre a célra is tökléletesen megfelel egy a fentihez hasonló kód, mentesítve ezzel a processzort egy halom felesleges munka alól. A letölthető források között található egy timer_onEnterFrame.fla és egy timer_setInterval.fla. Érdemes megnyitni a feladatkezelőt (WinXP, 2000, NT alatt), és a két fla-t tesztelni... látható, hogy az onEnterFrame-es megoldás eléggé ellopja a processzoridőt, míg a setInterval alig-alig piszkálja a processzort.

function myTrace() {
     _root.myTime = Date();
}
setInterval(myTrace, 1000);



Szintaxis

A setInterval függvényt két módon használhatjuk, ennek megfelelően kétféle szintaktia lehetséges:

setInterval( function, interval[, arg1, arg2, ..., argn] )
setInterval( object, methodName, interval[, arg1, arg2, ..., argn] )

paraméterek:
• function - végrahajtani kívánt függvény hivatkozási neve
• object - object, amelynek a metódusát szeretnénk meghívni
• methodName - az object metódusának neve
• interval - végrehajtás gyakorisága miliszekundumban
• arg.. - a függvény, vagy metódus paraméterei


A setInterval függvény egy visszatérő értéket és ad, hogy a függvényhívás törölhető legyen a clearInterval() függvény segítségével. Így nem csak végtelenített lehet a függvényhívások száma, hanem egy tetszőleges ponton törölhetjük az intervallumot.

Az első pédánkhoz visszatérve bemutatom, hogyan törölhető a függvényhívás:

function myTrace() {
     trace(i++);
     if (i>5) {
          clearInterval(clearID);
     }
}
var i = 0;
var clearID = setInterval(myTrace, 1000);


Itt annyi változott, hogy csak 5 alkalommal fut le a myTrace függvény, mivel az i értékét figyelve töröljük az intervallumot.


Késleletés

A setInterval() függvény alkalmazható késleltetés beiktatására is. Csupán annyi a dolgunk, hogy a függvény utolsó sorába feltétel nélkül töröljük az intervallumot. A setInterval ugyanis a meghíváskor kezdi mérni az időt, és az első függvényhívás az intervallumban meghatározott idő elteltével történik.

A mellékelt források között található egy waiting.fla. Ebben egy egyszerű példát tralálunk erre a késleltetésre.

function myTrace() {
     trace("myTrace függvény végrehatódott");
     clearInterval(clearID);
}
var i = 0;
var clearID;
function onClick() {
     trace("késleltetés indul");
     clearID = setInterval(myTrace, 1000);
}


Ebben ezen a kódon kívül van egy button is, ami meghívja az itt látható onClick függvényt. Ekkor kiíródik az első üzenet, miszerint "késleltetés indul", és beállítjuk a setInterval segítségével, hogy 1000 msec múlva fusson csak le a myTrace() függvényünk.... és íme valóban egy kis késéssel láthatjuk az output ablakban az üzenetet "myTrace függvény lefutott".


Object method

Egy gyors példát bemutatok az objektumok metódushívására is, bár teljesen azonos módon működik a függvényekkel.
Készítettem egy MC-t, amiben egy négyzet 90 fokot fordul. Ezt elhelyeztem a movie-ban, és az instance name-nek a 'negyzet'-et atdam. A következő kódot a _root-ba kell írni:

setInterval(negyzet,"play",2000);

Így 2 másodpercenként lejátszódik a négyzet elfordulása. Ha egy kicsit meg szeretnénk bolondítani, akkor a kódot a következőre kell cserélni:

var randomWait;
randomPlay();
function randomPlay() {
     negyzet.play();
     randomWait = Math.random()*2000+500;
     clearInterval(clearID);
     clearID = setInterval(randomPlay, randomWait);
}



A setInterval/clearInterval függvénypár használatával rengeteg időzítési probléma megoldható, remélem mindenki hasznosnak találja majd.

 
 
 

© Devnet.hu. A segédletek semmilyen formában nem másolhatók, publikálhatók a Devnet.hu és a szerzők közös írásos engedélye nélkül.
 
. .. : Swf.hu 1.0 archívum : Swf.hu főoldal >>> : .. .