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


 
 
SEGÉDLETEK Effektus-trükk

Részecskerendszer (particle-system) segédlet
  feltöltve: 2003.12.10 | szerző: Newone | olvasva: 14429 alkalommal

           
 

Tervezés

A tervezésünk nem lesz túl bonyolított (pl.: UML diagramok használata), hanem afféle józan paraszti.
UML: (Unified Modeling Language), objektum orientált programok tervezésekor használt szabályrendszer, amely segít megtervezni és vizuálisan is megjeleníteni a tervezett osztályokat, azok struktúráját, no meg az egész programot, stb. Ahhoz, hogy a részecskéket generáljuk szükségünk van valami ciklusszerűségre. Úgy döntöttem, hogy a generálást egy MC, onEnterFrame eseménykezelőjének segítségével oldom meg. Ahhoz, hogy a részecskerendszer mindig jól elválasztható legyen a mozi egyébkénti struktúrájától, egy külön, a részecskerendszert tartalmazó MC-t hozok majd létre. Ezt elneveztem hordozónak.

Az alábbi lépések elvégzésére van szükség:

•  Részecsketulajdonságok megadása
•  Részecskerendszer generálása
•  Ha szükséges, akkor a részecskék folyamatos szinten tartása
•  Részecske elemek Üzenőkké változtatása
•  A részecskegeneráló Figyelővé változtatása

Az utolsó pontot egy kicsit meg kell magyarázni. Ha folyamatos részecskeáramlást akarunk létrehozni, (pl.: a tűz ilyen), akkor két dolgot tehetünk:

•  Vagy a részecske elem belső animációja ismétlődik meg folytonosan
•  Vagy a részecskéket generáljuk folyamatosan

Az első eset elég egyzserű, készítünk egy állandóan ismétlődő animációjú részecskeelemet. Legeneráljuk a részecskerendszert és kész is. A második eset egy kicsit bonyolultabb, hiszen itt vizsgálni kell, hogy melyik részecske elem ért az élete végére, azt ki kell törölni és újat létrehozni. A segédletben mind a kettőt megvalósítjuk. Mivel a segédlet jó nagy része az eseményalapúságról szól, ezért kézenfekvő, hogy ezt a módszert választom a folyamatos generálás megoldásához.

Nézzük meg az alábbi ábrát:

Az ábra szemlélteti a programunk tervezett futási folyamatát.

Általában egy tervezési szakaszban ilyen típusú folyamatábra nincs. Látható, hogy itt már hivatkozok konkrét elnevezésekre is, amelyeket csak rendszertervbe szokás (és kell) tenni, de a funkcionális specifikációba nem. A funkcionális specifikáció az, ahol megtervezzük a leendő rendszer funkcionalitását, definiáljuk a rendszerrel szemben támasztott követelményeket. Ám mivel ez a segédlet már így is terjedelmes lesz és nem a rendszertervezés lépéseit hivatott bemutatni, ez az egyveleg ábra jobb szolgálatot tesz.

Tervezett osztályok

A részecskerendszert úgy próbálom felépíteni, hogy semmi másra ne legyen szükség az előállításukhoz, mint adott osztályok használatára. A lehető legkevesebb egyéb, a moziban ide-oda helyezett kód felhasználásával.

OSP_mcEventSource

Terveim szerint egy részecske elem, amikor elérkezik élete végére, üzenni fog a részecskegenerátornak, hogy itt a vég, és generáljon helyette egy új részecskét. Egy részecske elem, nem más, mint egy MovieClip. Ezt felismerve az adott részecskét alkotó MovieClip-et kell ellátnom saját eseménykezelő funkcionalitással. Ám jobban járok, ha nem csak mindig az adott részecskét alkotó MC-nek adok ilyen funkcionalitást, hanem generálisan a MovieClip-nek. Így memóriát spórolok. Aki elolvasta Tenegri írását és egyéb más forrásból is táplálkozott, tudja, miről beszélek.

A fentieket mérlegelve készítettem egy osztályt, amely generálisan a MovieClip osztálynak biztosít egy saját, univerzális eseménykezelőt, amelyet bármikor meghívhatunk (azaz üzenhetünk), bármilyen paraméterrel. Ezzel csak azt akarom mondani, hogy máshol is felhasználható a funkcionalitás, nem csak az itt bemutatott részecskerendszernél. Itt már rögtön megmutatkozik az OOP előnye.

OSP_mcEventSource meghívásának hatására, mindegyik MC rendelkezni fog egy sendCustomMessage metódussal, amely egy paramétert fogad, de ez bármi lehet, Object, Array, String, stb.

Az osztály forráskódját és a soronkénti magyarázatokat a letölthető file-ok közül, a CustomClasses\General\ OSP_mcEventSource.as-ben találhatja meg az olvasó.

OSP_mcEventSource osztálynak akkor van szerepe, ha folyamatos részecskeáramlást akarunk megvalósítani.

OSP_generateParticleSystem

Az osztály fő feladata, hogy előállítsa a részecskerendszert, a megadott paraméterek alapján. Ha csak ezt az osztályt használjuk, akkor a részecskerendszert létrehozzuk, de itt be is fejeződött a szerep. Az osztály nem foglalkozik tovább a generált részecskékkel.

Forrásfile + magyarázatok: CustomClasses\ParticleSystem\OSP_generateParticleSystem

OSP_keepAliveParticleSystem

Ez az osztály, az OSP_generateParticleSystem osztályból származtatott osztály. Minden képességgel rendelkezik, mint a szülő, de ki is egészül két metódussal.

Az egyik metódus megvalósítja a Figyelő-től elvárt funkcionalitást, vagyis az Üzenő üzenetét figyeli és reagál rá, ha bekövetkezik.

A másik metódus, pedig biztosítja a folyamatos részecskegenerálást úgy, hogy a lejárt életű részecskéket megszünteti és újat hoz létre a helyettük és a helyükre.

Az "helyükre" megállapítás nagyon fontos. Amikor egy MC-ét duplikálunk, vagy becsatolunk (attachMovie) mindig meg kell adni egy egyedi nevet és a szintet, ahová az új MC létrejön. Ezt általában folyamatosan növőekvő, vagy csökkenő számozással oldjuk meg. Ha egy MC-nek ugyan azt a nevet és szintet adjuk meg, mint egy másik, már létezőnek, akkor gondjaink lesznek. A részecskerendszer esetében el akartam kerülni, hogy a végtelenségig növeljük a számot (amúgy sem lehetne), és azt is, hogy egy másik már létező MC helyére hozzam létre az újat. Ezért trükköt alkalmaztam az ID változó bevezetésével. Minden létrehozott részecske, ID változójában eltárolom, hogy milyen számot kapott és egy részecske törlésekor, az új részecskét az előzőleg törölt részecske számaival hozom létre. Ez némi véletlenszerűséget is kölcsönöz az effektnek, de ezt már tapasztalja ki az olvasó.

Forrásfile + magyarázatok: CustomClasses\ParticleSystem\OSP_keepAliveParticleSystem
Végeztünk is. A részecskerendszerünk jelen állapotában, nem áll több osztályból.

 
           
 
 

© 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 >>> : .. .