Események hozzákapcsolása MovieClip-hez

Elkezdtem gondolkodni, milyen frankó is lenne, hogy a Flash-ben gyakran használt effekteket hogyan tudnék hozzákapcsolni MovieClip-ekhez, megkönnyítve ezzel saját életemet. Egyszerű és gyakran használt effektek alatt a következőket értem:

  • csúszás új koordinátákra
  • átlátszóság megváltoztatása
  • átszíneződés
  • átméreteződés

Ezt persze nem úgy értem, hogy a következő képkockán már az összes új tulajdonság látszik (persze ez is lehetséges a bemutatott függvények esetén is, de vannak erre egyszerűbb módok is), hanem fokozatosan (a később bemutatott megoldás szerint lassulva) történik meg a változás a mozin. Ha még mindig nem lenne világos, ezt úgy értem például csúszás esetén, hogy a MovieClip elindul a jelenlegi koordinátájából a célkoordináta felé több képkockán keresztül, miközben mozgása folyamatosan lassul, majd megáll a célkoordinátánál.

Mivel jelenleg MovieClipról van szó, ezért használjuk a MovieClip.prototype “tulajdonságot”, melyel bővíteni lehet a MovieClipek mint objektumok függvényeinek körét. Alkalmazásával minden MovieClip-ben elérhetővé válik az újonnan hozzáadott függvény. Ez nagyon szerencsés, mivel így a függvényeket csak egyszer kell megírni, és minden mozi esetén használhatjuk, ami igazán kényelmes.

Események

A két legfontosabb dolog, ha vmi új tulajdonság(ka)t akarunk adni egy objektumnak, hogy kell hozzáadó és elvevő függvény. Én az események tárolására elég egyszerű, de ugyanakkor teljesen elegendő módot választottam: tömbben tárolom az eseménykezelő függvényeket.
Az egésznek a lényege, hogy hozzáadunk eseményeket a mozihoz, majd végigmegyünk az összes eseményen, és végrehajtjuk őket az aktuális mozin. Ha egy esemény befejeződött (azaz nincs már mit csinálnia), akkor eltávolítja magát az események listájáról.
Mint már említettem korábban az egésznek az alapja a hozzáadás és elvétel. Ennek ürügyén létrehozzuk a MovieClip.prototype.attachEvent függvényt az esemény hozzáadására és a MovieClip.prototype.detachEvent függvényt az esemény eltávolítására. Mindkettő függvény egy függvényt fogad paraméterül. Hogy ez pontosan mit jelent, hamarosan fény derül erre is.

Esemény hozzáadása

A MovieClip.prototype.attachEvent nem csinál sok mindent, de amit csinál, az nagyon fontos. Leellenőrzi, hogy létezik-e a MovieClip-nek _events tulajdonsága, ha nem, akkor létrehoz egy tömböt ezen a néven, és hozzáadja az eseményt a tömbhöz ( push ). Itt is mint a hasonló függvényekben a this nevű objektumot használjuk, ami mindig az aktuálisan feldolgozott mozit jelenti.
A függvényt mint paramétert úgy kell elképzelni, hogy paraméterként átadjuk a függvény nevét (a függvénynek látszódnia kell az aktuális helyen) függvénynév formában (nem kell utána a két zárójel: () ugyanis, akkor a függvény meghívódik). Ilyen esetben sajnos nem tudunk paraméterket megadni a függvénynek, ezért erre is van megoldás a csatolt példák között.

Esemény eltávolítása

A hozzáadáshoz hasolóan kell itt eljárni, csak éppen a tömbből etávolítani kell az elemet. Ehhez végigmegyünk az eseményeket ( for ciklussal ), és ha megtaláljuk az illető eseményt, akkor a Array splice nevű függvényével eltávolítjuk. Nem használjuk ki a splice minden tudását, csak az aktuális elemet távolítjuk el, pedig sokkal többet is tudna ennél. Ugyanis a splice képes egy tömbből a x kezdő elemetől kezdve y elemet eltávolítani, és beszúrni a helyére z új elemet.

Események lejátszása

Miután ilyen szépen tudunk elemeket hozzáadni, eltávolítani, futtassuk is őket. Erre született a playEvents függvény, ami for..in ciklussal végigmegy az _events tömbön, és lefuttatjuk az egyes eseményeket. Ez a rész kicsit több magyarázatra szorul.
Miért is pont a for..in ciklussal csinálom?

  • Mert kényelmes,
  • mert ha az esemény befejezte működését és eltávolítja magát, akkor sincs veszve semmi, a ciklus tovább tud lépni a következő, még be nem fejezett eseményre.

A függvények meghívása is trükkös. Itt jön elő a nagyon ritkán használt függvény, a call. Minden függvény típusú objektumnak (és minden függvény függvény típusú objektum a Flash-ben) van ugyanis egy call függvénye, ami ugyan csak kicsit több a függvény meghívásánál, de éppen ez kell nekünk. Az a kicsi, pedig az, hogy első paraméterként egy objektumot vár, amin végre fogja hajtani a függvényt. A többi paramétere pedig a függvénynek átadandó paraméterek. Jelen esetben ezt úgy használjuk hogy az éppen kiválasztott függvényt az aktuális MovieClip-en, mint első paraméter, hajtjuk végre.
Újabb érdekes dolgok következnek. Ha ugyanis a for..in ciklus befejeztével elfogynak a események akkor újabb dolgok történhetnek.
Ha a playEvents volt a MovieClip-ünk onEnterFrame eseményére kapcsolt függvény, akkor az eltávolításra kerül. Ennek vizsgálata is trükkös. Minden függvény lefutásakor létrejön ugyanis egy arguments objektum, ami lényegében egy tömb, ami a függvény paramétereit tárolja, de van két extra tulajdonsága. Az arguments.callee az aktuális függvényre mutat, míg az arguments.caller a meghívó függvényre. Ezt kihasználva összehasonlítjuk, az aktuális MovieClip onEnterFrame eseményét az arguments.callee-val. Ha azonosak (azaz a playEvents lejátszódik a mozi minden egyes képkockáján), akkor eltávolítjuk az onEnterFrame eseményt a moziról.

Itt kell megemlítenem egy másik függvényt, ami pedig a MovieClip.prototype.startPlayEvents .
A függvény két dolgot tesz. Az első, hogy a MovieClip onEnterFrame eseményéhez hozzárendeli a playEvents függvényt. A második, hogy meghatározza, hogy történjen-e valami, ha az összes esemény, amit az MovieClip.prototype.attachEvent -el kapcsoltunk a mozihoz befejeződött.
Ez két paramétert vár. az első paraméter egy függvény, amit majd akkor futtatunk le, ha az összes mozira kapcsolt esemény lejátszódott, a másik pedig a célobjektum, amin a függvényt végre kell hajtani. Ha nem adunk meg függvényt, akkor nem történik semmi, az események befejeztével, és ha nem adjuk meg a célobjektumot, akkor pedig az aktuális MovieClip-en lesz végrehajtva az első paraméterként függvény.
Most visszatérnék a playEvents működésére. Ott fejeztem be, hogy eltávolítjuk az onEnterFrame eseményt a moziról ha ez a playEvents volt. Ezután, ha a MovieClip.prototype.startPlayEvents -ben megadtunk függvényt, akkor az az imént leírtak szerint végrehajtódik.

Kezdetnek legyen ennyi elég, hamarosan bemutatom, hogyan is érdemes ezeket a hozzákapcsolt eseményeket megírni. Példaként szolgáljanak a csatolt MovieClip.as-ben definiált függvények, melyek működésére ki fogok térni egy további bejegyzés keretein belül. Addig is, ahogy az angolok szokták mondanai:
Stay tuned!

comments powered by Disqus