Phaser podporuje celý rad rôznych fyzikálnych systémov. Fungujú ako pluginy dostupné v každej scéne. V čase tvorby tohto kurzu bola dostupná arkádová fyzika a fyzikálne enginy Impact Physics a Matter.js. V tomto kurze používáme jednoduchú a odľahčenú arkádovú fyziku, ktorá je perfektná pre mobilné prehliadače.
Keď sa vytvorí fyzikálny sprite, je mu priradená vlastnosť body
, čo je referencia na jeho fyzikálne teleso v systéme arkádovej fyziky. Objekt 'body' má veľa vlastností a metód, s ktorými sa môžeš pohrať.
Napríklad, ak chceme simulovať efekt gravitácie, tak jednoducho napíšeme:
player.body.setGravityY(300)
Argumentom je ľubovolná hodnota, ale je logické, že vyššia hodnota znamená rychlejší pád. Ak pridáš tento kód alebo spustíš part5.html
, uvidíš hráča padajúceho dole a ignorujúceho terén, ktorý sme vytvorili:
Dôvodom tohto správania je to, že zatiaľ ešte netestujeme kolízie medzi terénom a hráčom.
Už sme frameworku Phaser povedali, že náš terén a plošinky sú statické telesá. Ak by sme to neurobili a vytvorili by sme dynamické telesá, potom, ak by sa hráč s nimi zrazil, tak by sa na chvíľku zastavil a potom by sa všetko rozpadlo. Ak nie je povedané inak, sprite pre terén je dynamický a keď do neho hráč narazí, tak výsledná sila kolízie je na neho aplikovaná. Telesá si vymenia svoju rýchlosť a podlaha začne tiež padať.
Aby sme umožnili hráčovi kolidovať s plošinkami, vytvoríme si objekt Collider. Tento objekt monitoruje dva fyzikálne objekty (aj prípadné skupiny) a testuje kolíziu alebo prekrytie medzi nimi. Ak dôjde ku kolízii, tak je možné voliteľne vyvolať callback, ale pri jednoduchej kolízii s plošinkami ho nepotrebujeme.
this.physics.add.collider(player, platforms);
Collider je ten, kto čaruje. Vezme si dva objekty a otestuje, či kolidujú. V našom prípade mu dávame hráča a skupinu plošiniek. Collider je dostatočne chytrý na to, aby otestoval kolíziu so všetkými členmi skupiny, takže toto jediné volanie otestuje kolíziu s terénom a všetkými plošinkami. Výsledkom jeho práce je to, že plošinky sa správajú naozaj staticky: