Czy powinienem przenieść świat czy gracza?

11

Zaraz zacznę rozwijać grę z przewijaniem boków, w której celem gracza jest podróżowanie jak najdalej w osi poziomej przed dotknięciem w dół. Pamiętaj, że nie muszę nigdy wracać na osi poziomej.

Rozwijam to w AndEngine na Androida, który korzysta z OpenGL i Box2d.

Zanim zacznę, muszę zdecydować o czymś ważnym: czy powinienem używać świata wokół gracza, aby symulować ruch, czy faktycznie przenieść gracza i podążać za nim z funkcjami kamery silnika gry?

Oba podejścia wydają się mieć różne zalety i wady, więc nie wiem, które z nich uważa się za najlepsze. Na przykład, co ułatwi dodawanie ulepszeń po drodze i ładne animowane tło?

Dzięki!

monoceres
źródło
2
Przesuń aparat.
Jonathan Dickinson
1
Jeśli nie masz konkretnego powodu, aby nie chcieć korzystać z aparatu (który został już dla Ciebie napisany), powinieneś przenieść odtwarzacz i aparat. Dodanie „ulepszeń” nie powinno mieć żadnego wpływu.
Christopher Horenstein

Odpowiedzi:

9

Przesuń aparat (dołączony do odtwarzacza). Wyobrażam sobie, że twój świat ma wiele obiektów, takich jak wrogowie. Jeśli zajmowałeś się przemieszczaniem świata, musiałbyś przeszukiwać wszystkie te obiekty, aby aktualizować ich pozycje za każdym razem, gdy świat się poruszał.

Jeśli przeniesiesz odtwarzacz i podłączysz kamerę do odtwarzacza, zużycie zasobów będzie minimalne. Gra przejdzie do fazy renderowania, obejrzy wszystko raz, tak jak robi to każdą klatkę, i narysuje je w pozycji - pozycja kamery. W tym przypadku pozycja kamery zawsze będzie równa pozycji gracza.

Mydliny
źródło
Oczywiście, jeśli obiekty są wrogami, nie musielibyście ich omijać, wystarczy dodać ruchy światów do ich metod aktualizacji.
SirYakalot,
1
+1. Użyj, camera.setChaseEntity(player);aby to osiągnąć.
MartinTeeVarga
6

Zawsze poruszam aparatem i polecam go - jest wiele powodów, dla których wolę to, ale najważniejsze to sprowadza się do tego:

  1. Jeśli poruszasz kamerą i odtwarzaczem, to tylko dwa byty muszą zostać zaktualizowane, aby przewinąć ekran.

  2. Jeśli przenosisz cały świat za każdym razem, gdy ekran wymaga przewijania, obejmuje to nieznaną i prawdopodobnie dużą liczbę jednostek, które będą musiały zostać zaktualizowane.

David Gouveia
źródło
Zgadzam się, ale dodałbym, że zwykłe dodanie linii + = 'przemieszczanie światów do klasy wroga byłoby dość trywialne.
SirYakalot
@AsherEinhorn Wydaje mi się, że mówisz o takim scenariuszu, jak wykres sceny, w którym każdy węzeł dzieli transformacje rodzica, a po prostu przeniesienie węzła głównego (tj. „Świata”) przetłumaczy wszystko inne automatycznie? Ponieważ w każdym innym przypadku poruszanie światem oznacza przenoszenie wszystkiego na świecie - co było celem mojego postu.
David Gouveia,
cóż, jeśli ruch świata jest odwrotnie proporcjonalny do gracza. tzn. - poruszasz się do przodu, świat się cofa, wtedy możesz po prostu - = ruch graczy do wszystkich obiektów gry. Zgadzam się z tobą. Mówię tylko, że istnieją trywialne sposoby na doprowadzenie obu do pracy.
SirYakalot
4

To naprawdę bardzo trywialne, tak naprawdę nie robi różnicy od opisywanych rzeczy.

Albo przesuniesz tło obok kamery i odtwarzacza, albo przesuniesz gracza i kamerę razem z nim. Przypuszczam, że jest tylko jedna rzecz do zrobienia, jeśli przesuniesz tło.

Chociaż przypuszczam, że jeśli przesuniesz tło, będziesz musiał nadać rodzicom wszelkie przetworniki i wrogów, co znowu jest trywialne, ale warto o tym pomyśleć.

Osobiście poruszyłbym gracza, ponieważ lubię rzeczy do zrobienia w bardziej realistyczny sposób.

SirYakalot
źródło
0

Inne odpowiedzi są dobre, ale chciałbym dodać kilka punktów tego, co jest lepsze, mając nadzieję, że pomogę komuś, kto spróbuje podjąć tę samą decyzję dla innego projektu.

Przenoszenie odtwarzacza:

  • To proste, wszystko inne jest statyczne (ish), więc w uproszczeniu jedyną rzeczą, którą musisz zrobić, aby przenieść odtwarzacz, jest player.x += 5;(pseudokod).
  • „Klika lepiej” dla większości ludzi. Podczas gry zawsze myślisz, że gracz się porusza, a nie na odwrót. Łatwiej więc myśleć o tym jako o „Gracz powinien się ruszać, a nie świat”, co z kolei może ułatwić komuś uporządkowanie go w głowie.
  • Łatwe do śledzenia, gdzie jest gracz (jego pozycja to także jego współrzędne na mapie)

Moving the World:

  • Jeśli Twoja gra jest wystarczająco duża, nie musisz się martwić o przepełnienie / niedomiar, przesuwając się zbyt daleko od centrum świata, ponieważ pozycja gracza jest zawsze bardzo blisko 0.
  • Podobnie jak powyżej, jeśli masz problemy z obliczeniami 3D, nie musisz się martwić o niedokładne wyniki z zmiennoprzecinkowymi, ponieważ wszystko, co widzisz na ekranie, powinno być dość blisko 0.
  • Jeśli zrobisz to poprawnie, możesz stworzyć „nieskończony” świat.
  • Musisz śledzić gracza ręcznie, pozycja gracza zawsze będzie niewielka, co oznacza, gdzie gracz jest na ekranie (trochę), aby wiedzieć, czy gracz jest w lewym górnym rogu mapy, czy w prawym dolnym rogu, musicie w jakiś sposób to śledzić.

Ostatecznie zależy to od projektu. Jeśli ktoś tworzy oryginalnego klona Mario, przenoszenie świata może być skomplikowane, podczas gdy przenoszenie gracza tak naprawdę nie stwarza wielu problemów. Chcąc stworzyć ogromną grę typu open-world, lepiej zamiast tego przenieść świat.

TomTsagk
źródło