Jaka jest dobra metoda przewijania w grze opartej na kafelkach 2D?

9

Korzystam z Direct3D z opakowaniem D3DXSPRITE, aby narysować kafelki na ekranie. Mam klasę kafelków, która zawiera elementy takie jak typ kolizji i kafelek, a następnie mam tablicę kafelków, np

Siatka kafelkowa [256] [256];

Która metoda byłaby lepsza?

- Narysuj gracza na środku ekranu i przesuń tam, gdzie rysuje mapa.

-Przesuń odtwarzacz, podążając za kamerą.

Korzystałem z pierwszej metody, ale jej komplikowanie jest bardzo skomplikowane, gdy dojdziesz do lewej górnej krawędzi mapy, a gdy inni gracze / wrogowie znajdą się na mapie i poruszają się w tym samym czasie

jeśli zmuszę kamerę do podążania za odtwarzaczem, czy będę musiał wywoływać spriteBatch-> Draw (...) dla każdego kafelka siatki, chociaż tylko kilka może zmieścić się na ekranie?


źródło

Odpowiedzi:

4

Prawdopodobnie najlepiej wykonać wszystkie aktualizacje i obliczenia w „rzeczywistych” jednostkach świata i przenieść kamerę. Twój spriteBatch może sam wykonać culling, ale jeśli jest zbyt wolny, możesz spróbować określić, które kafelki mają być wyświetlane na ekranie i tylko je narysować.


źródło
Prawdopodobnie będziesz chciał napisać kod, aby narysować tylko te duszki, które są widoczne, szczególnie jeśli okaże się, że musisz zwiększyć rozmiar swojej siatki.
2

Przesuwanie kamery we współrzędnych świata i sprawienie, by twoja postać poruszała się po świecie, jest najprostszym sposobem na rozwiązanie tego problemu, praca we współrzędnych świata oznacza, że ​​nie musisz wykonywać żadnych dodatkowych obliczeń, gdy sprowadza się do wszystkich innych systemów, które muszą działać na względny układ współrzędnych, a także zrozumieć, gdzie znajdują się we współrzędnych światowych.

Ponieważ pracujesz w 2D, inną dobrą wskazówką jest wykonanie partycjonowania przestrzennego, najłatwiejszym sposobem byłoby stworzenie systemu siatki wirtualnego świata, pozwoli to na zarządzanie każdym kafelkiem osobno poprzez skojarzenie duszków i innych zasobów na podstawie kafelków, więc w istocie proces byłby następujący:

  • utwórz klasę kafelków, która może utrzymywać współrzędne graniczne kafelka i wszelkie zasoby, których może potrzebować konkretny kafelek (duszki, wrogowie itp.).

  • zdecyduj o wielkości swojego świata i utwórz tablicę 2D (możesz użyć jednego wymiaru i uzyskać do niego dostęp jako 2D) kafelków, z których każdy reprezentuje kawałek twojego świata ze wszystkimi powiązanymi z nim zasobami.

  • dobieraj zasoby tylko z kafelka, w którym znajduje się gracz i jego sąsiedzi.

Za pomocą siatki możesz łatwo dowiedzieć się, na którym kafelku znajduje się gracz, na podstawie jego położenia względem początku siatki.

Aby obejść problem, o którym wspomniałeś o kamerze, musisz ustawić odtwarzacz i kamerę w dwa niezależne systemy, w których kamera nie przesunie się dalej niż środek kafelków krawędzi, więc gdy gracz podróżuje do tego kafelka, może nadal podróżować cały kafelek, ponieważ jest on związany współrzędnymi świata (tj. nie jest już wyśrodkowany na ekranie), ale kamera jest zablokowana.

Sergio Franco
źródło
0

Używam powierzchni. Tworzę cały świat na powierzchni poza ekranem i zachowuję współrzędne xiy. Zmieniam je, gdy gracz się porusza, a każda klatka rysuje prostokąt 1028 x 768 z powierzchni do bufora za pomocą x i y.

co do innych ludzi, daję im xiy i pozwól im poruszać się po świecie, jak im się podoba, podczas rysowania sprawdzam, czy xiy jest w prostokącie 1028 x 768, a jeśli tak, to narysuj (używam tekstur dla ludzi) .

Mam gracza na środku ekranu i sprawdzam, czy krawędź świata osiągnęła krawędź ekranu. W tej sytuacji gracz przesuwa się po ekranie do krawędzi świata i wraca do centrum, po czym świat znów zaczyna się poruszać. wydaje się to trudne i zajęło mi trochę czasu, ale nie jest tak źle.

Używam 64 x 64 kafelków, a największy świat, z którego dotychczas korzystałem, to 50 x 60 kafelków.

Wszystko to odbywa się bezpośrednio w X za pomocą c ++

Skeith
źródło
1
To wygląda na OGROMNEGO wieprza pamięci. Trzymanie całego świata narysowanego na powierzchni poza ekranem spowoduje problemy z pamięcią, gdy zaczniesz chcieć robić takie rzeczy, jak posiadanie wielu (animowanych) warstw dla swojego świata i rozszerzanie go dalej niż to, co masz teraz. O wiele lepiej byłoby zachować informacje o świecie i rysować tylko te części / obiekty, które trzeba narysować, gdy trzeba je narysować. Tylko moje 2 centy. :)
Richard Marskell - Drackir
@Drackir Myślę, że źle zrozumiałeś. tylko świat jest rysowany poza ekranem, rzeczy takie jak inni ludzie są śledzeni i rysowani w buforze backera, gdy są potrzebni. także nie widzę, że robię więcej niż świat 70 x 70. kiedy mówię, że mam na myśli obszar, może to być miasto, loch lub wnętrze domu, gdy gracz porusza się między nimi, powierzchnia poza ekranem jest odtwarzana. tak, zajmuje pamięć, ale płytki 2d na nowoczesnych dyskach terrabitowych sprawiają, że jest to nieistotne, a ładowanie kilku sekund to niewielka cena za płynne przewijanie i animację. ale tak, są lepsze i trudniejsze sposoby :)
Skeith
Powierzchnia powinna być przechowywana w pamięci karty GFX, a nie na dysku twardym. Uważam jednak, że jeśli pamięć karty GFX jest zbyt duża, przeniesie ona powierzchnie na HD, co znacznie spowolni. Wprawdzie minęło trochę czasu, odkąd zajmowałem się tymi sprawami, więc nie pamiętam dokładnie, jak to działało, ale myślę, że dopóki nie rysujesz zbyt dużego świata, byłoby dobrze. :)
Richard Marskell - Drackir
@Drackir To interesujące wiedzieć, nigdy nie myślałem o tym w ten sposób. Przekonałem się, że ten sposób daje mi płynniejszy zwój, który jeśli dynamicznie rysuję nowe kafelki, więc myślę, że pasuje dobrze, ale muszę to sprawdzić.
Skeith
Pracowałem nad grą, w której miałem mapy 31x31, ale były one połączone razem. Próbowałem pracować z silnika innej osoby, a oni narysowali wszystkie mapy otaczające tę, na której był gracz; czyli w sumie dziewięć map. Każda mapa miała kilka (chyba 6) warstw. Podobnie jak 31x31x9x6 = 51894 rysowanych kafelków (oczywiście maksimum; nie wszystkie kafelki były pełne) za każdym razem, gdy użytkownik zmienia mapy. To było dla mnie ogromne spowolnienie, więc przepisałem procedurę rysowania, aby narysować płytki otaczające gracza tylko do 1 płytki poza krawędź ekranu (aby poradzić sobie z częściowymi płytkami podczas ruchu).
Richard Marskell - Drackir
0

To całkiem normalne, że kod sprawia trochę kłopotów w rogach kafelkowego świata, kiedy zastanawia się, które tiels narysować, i jednocześnie upewnia się, że kamera nie wychodzi poza świat. Te przypadki brzegowe są w zasadzie najbardziej komplikujące w implementacji świata opartego na kafelkach 2D, który jest większy niż rozdzielczość ekranu. Staje się znacznie bardziej skomplikowany, jeśli obsługuje się powiększanie i powiększanie do kursora: D

Cliffski
źródło