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?
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.
źródło
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 ++
źródło
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
źródło