Jak sterować postacią w grze?
W uprzednim artykule utworzyliśmy proste sterowanie postacią. Było ono jednak mocno uproszczone, dziś zajmiemy się poprawą nawigacji postacią w prawym kierunku...
Uproszczone sterowanie polegało na tym, że po kliknięciu w prawo nasz duszek był przesuwany o 10 pikseli w prawo i była uruchamiana jedna animacja lotu ptaka. Zatem, by przesunąć naszego bohatera o kolejny krok w prawo musieliśmy dotknać/kliknąć ponownie w przycisk w prawo. Takie sterowanie do wygodnych nie należy...
Spróbujmy teraz sprawić, by postać przemieszczała się w prawo dotąd aż puścimy przycisk "w prawo". By nie zaciemniać przekazu nie będę kopiował całego kodu a jedynie tam, gdzie nastąpiły zmiany.
function przesun_prawo(event)
if event.phase=="began" then
przesun_w_prawo=1
ptak:prepare("latanie")
ptak:play()
end
if event.phase=="ended" then
przesun_w_prawo=0
ptak:prepare("latanie")
ptak:pause()
end
end
function przesun()
if przesun_w_prawo==1 then
ptak.x=ptak.x+1
end
end
prawo:addEventListener("touch", przesun_prawo)
Runtime:addEventListener("enterFrame", przesun)
Zmian jest trochę.
- Funkcja przesuń w prawo teraz już nie przesuwa bezpośrednio naszej postaci lecz ustawia zmienną przesun_w_prawo na 1, gdy button jest wciśnięty i uruchamia w tym czasie animację ptaka.
Dodatkowo w funkcji tej też sprawdzany jest warunek upuszenia przycisku, który zmienia zmienną przesun_w_prawo na 0 a także resetuje animację poprzez: ptak:prepare("latanie") oraz włącza pauzę animacji: ptak:pause().
Początkowo, gdy nie dałem funkcji prepare("latanie") animacja ptaka zatrzymywała mi się w różnych pozach po puszczeniu przycisku co niekiedy mogłoby być niedopuszczalne, np. nie jest naturalne, by ludzik zatrzymywał się z jedną nogą z przodu a drugą z tyłu jak przy chodzie, czy skoku. Wystarczy popatrzeć na siebie - gdy się zatrzymujemy to z reguły wracamy do pozycji stojącej a jesteśmy zaawansowanej fazie skoku... - nowością jest tu bardzo prosta funkcja przesun(), która sprawdza, czy przycisk jest wciśnięty czyli przesun_w_prawo jest ustawione na 1 a wtedy przesuwa nasz obiekt o 1 piksel w prawo. W przeciwnym razie nie robi już nic.
- kolejną nowością jest dodanie nowego śledzenia zdarzenia, które wywoływane jest w zależności od ustawień 30 bądź też 60 razy na sekundę i z taką częstotliwością wywołuje funkcję przesun. Dzieje się to wszystko dzięki temu, że zdarzenie "enterFrame" jest wywoływane regularnie i dzięki temu możemy wykorzystać tą właściwość do periodialnych działań w naszej grze co się bardzo często przydaje.
- chyba ostatnią rzeczą, która została zmieniona (dotyczy kodu powyżej funkcji) to zmiana
sprite.add(lecacy_ptak_set, "latanie", 1, 6, 500, 1)
na
sprite.add(lecacy_ptak_set, "latanie", 1, 6, 500, 0) - czyli ostatnia cyfra została zmieniona z 1 na zero, co oznacza, że lecący ptak ma lecieć w nieskończoność, gdy uruchomimy go play'em no chyba, że go zpauzujemy poleceniem pause() co z resztą czynimy.
(Nie)Oczekiwane błędy programistyczne
Jak to w życiu programisty bywa - coś wydaje się, że działa ale niestety po jakimś czasie okazuje się, że nie do końca. Otóż w tej wersji, gdy klikniemy na przycisku "w prawo" przesuniemy palec i odpuścimy ale poza guzikiem to ptak nadal będzie leciał czyli nie nastąpi pauza.
Jak rozwiązać ten problem?
Trzeba dołożyć kolejne śledzenie zdarzenia "touch" ale poza obiektem prawo i tam przenieść obsługę upuszczenia. Dzięki takiemu rozwiązaniu nie będzie nam groźne przypadkowe lub celowe przesunięcie palca czy myszki i upuszczenie poza naszym śledzonym obiektem. Rozwiązanie zostawiam państwu do samodzielnego rozwiązania.
Czytaj dalej: Wirtualny joystick - sterowanie postacią
Warning: include_once(includes/rss_fetch.php) [function.include-once]: failed to open stream: No such file or directory in /home/ekoinst/domains/pcwiedza.pl/public_html/tworzenie-gier/includes/funkcje.php on line 548
Warning: include_once() [function.include]: Failed opening 'includes/rss_fetch.php' for inclusion (include_path='.:/opt/alt/php52/usr/share/pear:/opt/alt/php52/usr/share/php') in /home/ekoinst/domains/pcwiedza.pl/public_html/tworzenie-gier/includes/funkcje.php on line 548