Phaser obsługuje wiele systemów fizyki, każdy zachowuje się jak plugin dostępny dla dowolnej sceny. W czasie powstawania tego poradnika Phaser dostarczany jest z Arcade Physics, Impact Physics i Matter.js Physics. Na potrzeby tego tutorialu skupimy się jedynie na Arcade Physics, który jest prosty, niewymagający i co za tym idzie doskonały dla przeglądarek mobilnych.
Kiedy sprite z fizyką jest tworzony, ma on od początku właściwość body
, która jest odwołaniem do Arcade Physics Body. Ta właściwość reprezentuje sprite jako fizyczne ciało w silniku Arcade Physics. Posiada ona wiele właściwości i metod, dzięki którym możemy wpływać na zachowanie sprite'a.
Przykładowo aby zasymulować efekty grawitacji na sprite, wystarczy prosty kawałek kodu:
player.body.setGravityY(300)
Logicznie rzecz ujmując im ta wartość jest większa, tym szybciej obiekt spadnie w dół. Jeżeli dodasz ten kod do part5.html
zobaczysz, że gracz spadnie w dół poza ekran gry:
Powodem takiego zachowania jest brak detekcji kolizji dla gracza i podłoża.
Powiedzieliśmy już Phaserowi, że podłoże i platformy są statycznymi ciałami. Jeżeli zamiast tego uczynilibyśmy je dynamicznymi ciałami, po kolizji z graczem wszystko zaczęło by się zapadać. Stałoby się to dlatego, że jeżeli nie zaznaczymy inaczej, każdy sprite jest poruszającym się dynamicznym obiektem. Kiedy gracz uderzyłby w niego, dwa ciała wymieniłyby się prędkościami i wszystko by się rozleciało.
Aby gracz mógł kolidować z platformami należy stworzyć obiekt typu Collider. Jego zadaniem jest monitorowanie fizyki wielu obiektów (które mogą być zgrupowane). Dzięki temu możemy wykrywać kolizje i nachodzenie na siebie obiektów. Jeżeli to się zdarzy możemy wywołać własną funkcję zwrotną, nie musimy tego jednak tego robić jeżeli zależy nam tylko na tym żeby platformy służyły jako podłoże:
this.physics.add.collider(player, platforms);
Collider dokonuje w tym przypadku magii. Analizuje dwa obiekty pod kątem kolizji i separuje je od siebie. W tym przypadku dodajemy go do gracza i grupy platform. Collider automatycznie analizuje kolizje dla całej grupy obiektów. Zatem jedno wywołanie wystarczy żeby wszystkie platformy posiadały detekcję kolizji. Ostatecznym rezultatem są platformy, które nie będą się przemieszczały przy kontakcie z graczem: