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.
źródło
Odpowiedzi:
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ą).
źródło
Osobiście zbudowałbym mapę za pomocą wyznaczonego edytora kafelków, takiego jak TileEd . Takie podejście daje kilka korzyści:
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
Sprite
klasy lub skorzystać zCopy
funkcjiImage
klasy.Aktualizacja: Właśnie przeczytałem niektóre dokumenty SFML i zdecydowanie powinieneś używać
Drawable
lubSprite
zamiast manipulować obrazami ze względu na wydajność. Najwyraźniej istnieje tam moduł ładujący SFML . To prawdopodobnie dobry sposób na szybkie uruchomienie.źródło
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.
źródło
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/
źródło
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.
źródło