Najlepszy sposób na stworzenie mapy do gry 2D?

16

Przepraszam za subiektywne słowo kluczowe „najlepsze”.

Mój przyjaciel i ja rozpoczęliśmy tworzenie gry przygodowej 2D. Będzie on z góry na dół w stylu pokemona lub zelda (tylko perspektywa). Dyskutowaliśmy o metodach tworzenia dużej mapy świata, którą gracz może przemierzać bez obciążania możliwości pamięciowych naszego komputera.

Naszym pierwszym impulsem było stworzenie dużej mapy i okręgu wokół odtwarzacza, w którym zawartość zostanie załadowana. Uznaliśmy, że to nie potrwa długo i postanowiliśmy podzielić mapę na sekcje. Najpierw mieliśmy cztery duże sekcje, ale zdaliśmy sobie sprawę, że możemy po prostu podzielić je na wiele małych sekcji.

Grałem w Zeldę z SNES i zobaczyłem, że podczas zmiany mapy można w tej chwili załadować zawartość. Chodzi mi o to, że zamiast po prostu sprawdzać prostokątny obszar pod kątem danych do załadowania, po prostu dzielimy mapę na wiele małych kawałków, które ładują i rozładowują dane podczas przechodzenia od części mapy do części mapy.

Dzisiaj powiedział mi, że chce stworzyć prostą mapę macierzy 2D [SZEROKOŚĆ] [WYSOKOŚĆ], która zawiera dane o każdej siatce w grze i jest ciągłą operacją zapisywania na dysku dla danych, których nie potrzebujemy.

Nie jestem pewien co do tych pomysłów i pomyślałem, że mógłbym tak jak tutaj. Wszelkie linki, zasoby lub samouczki na ten temat byłyby bardzo mile widziane, a także bezpośrednie odpowiedzi na nasze pytanie, jak to zrobić skutecznie.

IAE
źródło
Z jakiej maszyny korzystasz?
David Titarenco,
Windows z C ++ używający do tej pory SFML (SFML może ulec zmianie; C ++ nie jest zmieniany). Nie dążymy do przenośności bankomatu.
IAE
2
Jeśli wybierasz się do starej szkoły Zelda na NES używam tylko map 1-ekranowych. Małe mapy pomagają graczom skoncentrować się na swoich zamiarach (tj. W lochach zajmujesz się tylko swoim pokojem. W diablo potwory nie poruszały się w górę i w dół pięter) i pozwalają im poczuć ukończenie, jeśli przeszukali cały obszar że gry typu open space, takie jak FAllout3 i Oblivion, nie dają ci.
Stephen Furlani,

Odpowiedzi:

27

Po pierwsze, oszacuj rozmiar mapy. Nie zakładaj tylko, że „wielki świat” nie zmieści się w pamięci. W dzisiejszych czasach mapa zajmująca ponad 10 mb pamięci jest absolutnie akceptowalna, a możesz wsadzić DUŻO w 10 mb w prostym, opartym na kafelkach świecie 2D.

Jeśli masz naprawdę duży świat, najbardziej niezawodnym rozwiązaniem jest użycie fragmentów mapy. Podziel swój świat na kawałki o stałej wielkości (powiedzmy 64x64). Załaduj fragmenty w locie, gdy gracz się porusza, utrzymując co najmniej jeden fragment załadowany we wszystkich kierunkach (tj. Załaduj fragment, w którym znajduje się gracz i wszyscy jego sąsiedzi).

Jeśli chodzi o rozładowywanie kawałków, możesz wybierać spośród kilku strategii. Z niecierpliwością rozładowywanie oznacza rozładowywanie i zapisywanie na dysku wszystkich kawałków w momencie, gdy gracz porusza się wystarczająco daleko; ale można również opóźnić rozładowanie w celu zwiększenia wydajności (oszczędzanie porcji, podobnie jak dostęp do dysku, jest kosztowną operacją).

Nieważne
źródło
6
Przykładowa matematyka: 10 MB płytek * daje ci kwadrat z 1619 płytkami na stronę. Oryginalne mapy Zelda zawierały 256 kafelków na długim boku i mniej niż połowę na krótszym boku - więc twoja mapa może być ponad 36 razy większa niż pierwsza Zelda przy takim zużyciu pamięci. Czy naprawdę jesteś przygotowany na tworzenie tak dużej ilości treści ? (Nie.)
@ user744 Ten komentarz jest niezwykle mylący. Aby utworzyć mapę, potrzebujesz więcej niż tylko wskaźniki do kafelków. Musisz także przechowywać dane, które zawierają kafelki. Nie każda gra 2D ma ustaloną liczbę wstępnie ustalonych stałych płytek.
Jeroen
5

Osobiście zbudowałbym mapę za pomocą wyznaczonego edytora kafelków, takiego jak TileEd . Takie podejście daje kilka korzyści:

  • Zużywa mniej zasobów. Musisz tylko załadować arkusz danych i plik danych z indeksami, aby zbudować potencjalnie nieskończoną mapę.
  • Ponieważ Twoja mapa będzie podzielona na naprawdę małe fragmenty (w zależności od wielkości kafelków), możesz łatwo dodawać / usuwać wiersze / kolumny, gdy postać porusza się po świecie.
  • Posiadanie pliku danych opisującego twoją mapę pozwala również łatwo dodawać informacje o terenie. Pozwala to na różnego rodzaju kafelki, takie jak ściany lub jeziora (np. Przeszkody) lub bagno, w którym ruch postaci może zostać spowolniony ...
  • Wreszcie mapa oparta na kafelkach jest również znacznie łatwiejsza do edycji i poprawiania w późniejszym czasie, ponieważ zawsze można uruchomić edytor, zmienić niektóre rzeczy i zapisać nowy plik danych.

Sugeruję unikanie ładowania fragmentów mapy podczas gry, aby uniknąć opóźnień. Jak wspomniano wcześniej, nie powinno to być konieczne, ponieważ prawdopodobnie będziesz w stanie zachować płytkę w pamięci. Gdy postać wkracza w inną część „świata”, możesz zamienić arkusz kafelków na inny (np. Kafelki śnieżne zastąpione pustynnymi).

Przesunięcie kafelków na ekran jest prawdopodobnie najszybszym sposobem renderowania mapy. Nie znam SFML, ale z dokumentów na ich stronie powinieneś zajrzeć do Spriteklasy lub skorzystać z Copyfunkcji Imageklasy.

Aktualizacja: Właśnie przeczytałem niektóre dokumenty SFML i zdecydowanie powinieneś używać Drawablelub Spritezamiast manipulować obrazami ze względu na wydajność. Najwyraźniej istnieje tam moduł ładujący SFML . To prawdopodobnie dobry sposób na szybkie uruchomienie.

grzmot
źródło
1

Zacznij od stworzenia mapy o rozmiarze wymaganym do opowiedzenia historii, którą chcesz opowiedzieć w grze. Przetestuj na maszynie z minimalną specyfikacją wymaganą do grania w twoją grę. Jeśli jest zbyt wolny, profiluj i optymalizuj.

Daniel X Moore
źródło
0

Moim zdaniem najlepsze jest użycie zestawu 2D poszczególnych płytek. Możesz mieć całą całą dużą mapę jako jedną tablicę 2D i narysować tylko tę część, która musi być wyświetlona w danym momencie. Poniżej znajduje się przykład użycia tablicy map 2D z biblioteką gier Tabageos (tbgs.js) HTML5; http://actiontad.com/tabageosHTML5/Examples/BlitMathCameraAndTravelers/

mrall
źródło
-3

O ile nie planujesz odbudować ultima-online (Fallout 3 lub Oblivion), nie ma powodu, dla którego świat musi być płynny. Baldur's Gate i Icewind Dale to dwie gry, które przychodzą na myśl, w których zastosowano skuteczne mapy, które nie zakłócają rozgrywki.

To prawda, że ​​masz znacznie większą moc obliczeniową niż oni, więc ekrany ładowania powinny być minimalne, ale nawet Fallout i Oblivion mają ekrany ładowania niektórych rzeczy.

Wszystko, co mogę ci powiedzieć, to to, że dla mnie piszę małą bibliotekę Obj-C dla iPhone'a, która bierze zestaw kafelków 32x32 i rysuje go w NSImage. W ten sposób uzyskuję około 10 klatek na sekundę i prawdopodobnie powinienem korzystać z OpenGL, ale muszę ponownie dobierać, jeśli postać wyjdzie z linii prostej.

Powinieneś podzielić mapę na 9 rozmiarów ekranu (dla mnie to bloki 960x640), więc jeśli postać wyjdzie z centralnego bloku, ponownie rysuję 9 ekranów na duży obraz (około 1,2 MB - daje dużo pokój poniżej limitu 20 MB w telefonie iPhone 3G). Dzieje się to dość powoli (znacznie wolniej niż 10 klatek na sekundę), więc ponowne losowanie nie jest zauważalne podczas gry.

Prawdopodobnie w pewnym momencie przejdę do OpenGL ES, ale na razie działa dobrze.


[EDYTOWAĆ]

Pozwól mi wyjaśnić.

Algorytm rysowania dla 9-ekranowego tła zajmuje 0,1 sekundy (10 klatek na sekundę). Jeśli twój gracz nie może przejść całego ekranu w mniej niż jedną dziesiątą sekundy, przerysowanie powinno być niezauważalne podczas gry.

Stephen Furlani
źródło
Tylko dlatego, że 10 klatek na sekundę jest akceptowalne dla twojej gry, nie jest dobrym pomysłem, szczególnie na urządzeniu z ograniczeniami mocy, takim jak iPhone. Możliwe, że przerysowujesz zero, pozwól stronie GPU obsłużyć rasteryzację i faktycznie pozwól programowi spać trochę czasu, aby telefon się nie nagrzewał lub wyczerpał się akumulator.
@Joe Wreschnig ... ??? Powiedziałem, że rysuje na żądanie, gdy gracz przesuwa ekran, w przeciwnym razie obraz tła dla UIImageView nie zostanie przerysowany , co oszczędza moc przetwarzania. Twój komentarz nie ma sensu.
Stephen Furlani,
Nie twierdzę, że fps wymaga twojej gry. Mówię, że OpenGL może zapewnić 60 klatek na sekundę dla takich rzeczy w sposób trywialny (naprawdę nie mówisz nawet o „przerysowaniu” scen statycznych i OpenGL) - jeśli potrzebujesz tylko 10 klatek na sekundę, wówczas użycie OpenGL pozwala nie marnować energii baterii na inne „50 klatek”. Twoja metoda rysowania jest marnotrawstwem w świecie z akceleracją GPU. Prawdopodobnie jest to OK na komputerze, ale nie wtedy, gdy wyczerpujesz baterię.
@Joe, wciąż nie jestem pewien, co mówisz. Rysuje obraz. Następnie obraz pozostaje sam, dopóki gracz nie osiągnie granicy, a następnie ponownie rysuje nowy obraz. Jak to marnuje żywotność baterii? „Rysuje” tylko na żądanie, a przez resztę czasu widok jest rysowany przy użyciu natywnego algorytmu rysowania UIImageView.
Stephen Furlani,