05 - Particle Systems
Last updated
Last updated
Začalo sa to v '80 rokoch. Vtedy bol definovaný pojem "particle system"
Od vtedy sa s ním stretávame všade tam, kde sa nám hodí simulácia vody, ohňa, dymu a podobne... Od filmov až po default vizualizér v iTunes (mimochodom, pôvodne napísaný prave v processingu)
Na vystavanie vlastného "particle" systému nám tentokrát bude stačiť takmer úplne kód z predchádzajúcich lekcií. Tentokrát získané znalosti ideme zúročiť.
Začnime so sytémom obsahujúcim "jednu časticu".
Tentokrát začnime s prázdnym sketchom. A pridajme doň poslednú verziu triedy Mover
. Avšak odteraz ju premenujeme na Particle
Všetky potrebné dáta a metódy tam už máme!
position
velocity
acceleration
display()
update()
A poďme jeden particle zobraziť + aplikovať gravitačnú silu:
Fajn. Zobrazí sa jeden bod. A padne dole.
Pre zjednodušenie tentokrát priamo v konštruktore v triede Particle
nastavme náhodnú velocity
.
Ok... vyletí hore a potom dole.
Čaro particle systému tkvie práve v tom, že tu nastáva "flow of particles". Stále pribúdajú nové.
Avšak aby to by mohlo spôsobiť, že časom sa pamäť zaplní a/alebo výpočet počítať prestane zvládať.
Kľúčovou novou vlastnosťou je zavedenie "životnosti" objektu.
Keď sa lifespan minie, dané miesto môžeme v pamäti uvoľniť.
Poďme si to teraz aplikovať na náš príklad s jednou časticou.
Použi vlastný sketch alebo výchádzaj z tohoto:
V sketchi v metóde draw kontroluj, či častica nieje kaput pomocou metódy isDead()
Ak sa jej čas naplnil, zmeň pozadie na červené
Miesto červeného pozadia vytvor opäť novú časticu.
Ok, možno si poviete... toto sme predsa užm robili.
Miesto let particle
bude teraz let particles = []
a prepísať particle -> particles a pridať for-cyklus.
Takmer... ale je tu jedno ALE. To ale súvisí s tým, že chceme mať prúd častíc - nové pribúdajú a staré sa mažú.
Pozrime sa, aké metódy máme k dispozícii pre Array()
v javascripte:
Uprav predošlú úlohu tak, aby pracovala s poľom particles
V každe iterácií draw()
pridaj ďaľší particle
Hint 1: Pre pridávanie particles môžeš použiť
Hint 2: Pre mazanie môžeš použiť
Použi vlastný sketch alebo výchádzaj z tohoto:
Pridaj v každom kroku viac prvkov naraz (použi for cyklus)
Skús použiť vlastný tvar - tak aby bol orientovaný. Napr. "fontánku"
Vo velocity
namiesto random()
použi randomGaussian()
Čo spraviť, ak chceme emitovať rôzne prvky?
Jedna zo skvelých možností, ktoré nám triedy umožňujú, je práve dedičnosť.
Je to v niečom podobné, ako napr. pri klasifikácií vtáctva:
Majú rovnaké atribúty:
zobák
krídla
2 × nohy
perie
A tiež zdielajú mnohé schopnosti. Vedia:
lietať
jesť
spať
Avšak každý druh vyzerá trocha inak - i keď s ostatnými zdiela hore vymenované atribúty a schopnosti. Niektoré vedia navyše aj plávať, iné loviť alebo spievať.
Pre našu situáciu by sme povedali, že máme triedu "Vták" a pod-triedy (resp. trieda -> rad -> čelaď -> druh)
Podobný vzťah si vieme definovať pri triedach. Kde vieme vytvoriť novú triedu (napr. SparkleParticle
ktorá rozširuje triedu Particle
)
Kľúčové sú tu dve slová: extends
a super()
Príklad:
Priprav obálku/krabičku s prekvapením. Po rozkliknutí z nej vyletia konfety.
konfety sú rôznych tvarov a farieb (vytvor nové triedy, ktoré rozširujú trietu Particle
)
v obálke/krabičke je ich presne definovaný obmedzený počet (napr. 1000) - ktorý sa priebežne míňa (a časom určite minie)
Príklad: