Mam grę, która generuje losową mapę poziomów na początku poziomu. Chcę wdrożyć jakiś sposób na zapisanie i załadowanie poziomu.
Pomyślałem, że może XML byłby dobrym rozwiązaniem do zapisania całej zmiennej, wtedy łatwo byłoby mi zbudować coś, co może przeanalizować ten XML i wygenerować dokładnie ten sam poziom.
Ale XML jest prawdopodobnie przesadą w stosunku do moich potrzeb. Pamiętam, jak kiedyś ze starą konsolą Sega, która nie miała możliwości zapisania twojej gry (myślę, że zrobiła to również gra Worms), dałaby ci mnóstwo charakteru, który możesz zapisać. Jeśli później wybijesz ten ciąg, załaduje on dokładny poziom.
Czy „ciąg znaków poziomu” byłby dobrym rozwiązaniem? Czy byłby to rodzaj konwersji „base60”? Jak mam to zaimplementować?
źródło
Bez względu na to, jakiego formatu używasz do zapisywania gier, na miłość boską, wpisz numer wersji. Będziesz mógł uzyskać ładowanie kompatybilne wstecz, rozgałęziając numer wersji, lub będziesz w stanie bezpiecznie rozpoznać zapisy, które są zbyt stare załadować.
Będziesz tego żałował, jeśli tego nie zrobisz.
źródło
JSON jest dobry, ale YAML jest lepszy. :) http://www.yaml.org/ i http://code.google.com/p/yaml-cpp/ dla jednej z ładniejszych implementacji.
YAML to nadzbiór JSON, który dodaje obsługę kilku fajnych funkcji, w szczególności:
źródło
Jeśli chcesz serializować wszystkie dane w grze, polecam JSON jako format pliku, dlatego łatwiej jest używać XML, a obsługa jest bardzo dobra w wielu językach.
Użyłem tej biblioteki dla C ++ i działa ona bardzo dobrze.
http://jsoncpp.sourceforge.net/
źródło
XML jest dobrym wyborem, jeśli nie jesteś ograniczony przez rozmiar i jest obsługiwany natywnie (np. W .NET i Flash), ale jeśli chcesz mieć wąski format, możesz łatwo stworzyć własny format i analizator składni. Zwykle używam 1 znaku, np. przecinek, aby oddzielić każdy obiekt. Aby zdekodować ciąg, wykonaj podział przecinkiem. Teraz każdy obiekt potrzebuje różnych właściwości, więc oddziel je innym znakiem, np. Średnikiem, i użyj innego znaku, aby oddzielić nazwy właściwości od wartości właściwości, np. Dwukropek. W ten sposób wszystko można łatwo zdekodować bez wyrażenia regularnego za pomocą string.split. Oto przykład:
możesz zaoszczędzić jeszcze więcej miejsca, ograniczając nazwy właściwości do 1 znaku, np. h dla zdrowia. Na przykład.
Porównaj z alternatywą JSON:
Ponadto, jeśli chcesz zmniejszyć rozmiar swoich liczb, możesz je zakodować przy użyciu pełnego zestawu drukowalnych znaków UTF16. Ten wątek zainspirował mnie do zadania pytania na temat przepełnienia stosu, ile danych można spakować w jedną postać na ekranie . Odpowiedź wydaje się być gdzieś ponad 40 000 wartości dla liczby całkowitej, jeśli nie masz nic przeciwko posiadaniu elementów Brail, Kanji i szachów: ♔♕♖♗♘♙♚♛♜♝♞♟
Aby uzyskać dalsze zmniejszenie rozmiaru, możesz użyć kolejności odczytu / zapisu, aby określić, która wartość jest która, więc pierwsze dwa znaki reprezentują identyfikator, następne dwa to pozycja x, następne dwa y, następnie kąt, a następnie zdrowie itd. Więc:
może przechowywać wszystkie te same informacje, co inne przykłady.
Siatki kafelków można przechowywać jako ciąg znaków, a każdy znak reprezentuje inny typ kafelka, np .:
gdzie mógłbym oznaczać lawę, 9 znaczy trawę itp
źródło
Jeśli kodujesz w .Net, XML jest bardzo łatwy w obsłudze, ponieważ możesz serializować / deserializować klasę poziomów do / z XML za pomocą zaledwie kilku linii, a następnie wszystko jest w ładnie zarządzanej klasie.
TheMap byłaby zmienną typu Mapa, do której załadowano wszystkie dane.
Zakładając, że masz już zbudowaną klasę Map, zapisuje to twoją mapę w formacie XML:
Spowodowałoby to załadowanie tego kodu XML z powrotem do klasy mapy, do ponownego użycia w kodzie.
Od tego momentu plik XML jest teraz ładowany do klasy w celu łatwego użycia.
Jeśli chodzi o problem z „ciągiem poziomów”, to, co zostało powiedziane wcześniej, działałoby świetnie, możesz po prostu użyć numeru początkowego jako „ciągu ciągu”.
W przeciwnym razie możesz po prostu wstępnie wygenerować dowolną liczbę różnych map i zapisać je za pomocą „Ciągu poziomów”, a następnie użyć go, aby pobrać odpowiednią mapę.
źródło
Użyłbym prostego
struct
lub podobnego urządzenia (w zależności od języka) do przechowywania wszystkich stanów gry w centralnym miejscu. Jeśli chcesz zabezpieczyć ustawiających / pobierających, możesz owinąć strukturę wclass
.Jeśli masz na to ochotę, skorzystaj z pól bitowych lub po prostu sam manipuluj bitami za pomocą operatorów bitowych.
Pamiętaj, że w niektórych językach reguły wypełniania struktur i pakowania mogą być nieco skomplikowane - ale może również nie mieć większego znaczenia dla twojej sprawy, jeśli masz bajt lub dwa wypełnienia.
Możesz także użyć
#pragma
(np.#pragma pack(1)
) Lub__attribute__
do ścisłego spakowania struktury, eliminując wypełnianie. To może, ale nie musi działać, w zależności od kompilatora i architektury docelowej.Zauważ, że użycie pól bitowych i pragmów lub atrybutów pakietów może zmniejszyć przenośność. We wszystkich architekturach sprzętowych endianness pola strukturalnego (kolejność bajtów) może również ulec zmianie. Możesz więc tego uniknąć, jeśli próbujesz przenieść.
(Na przykład Pac-Man, ta struktura może naiwnie zawierać identyfikator mapy lub ziarno mapy, pozycję x-y Pac-Mana, cztery pozycje x i y ducha oraz duże pole bitowe na obecność lub brak 32-64 granulek bez względu na maksimum).
Gdy masz już strukturę, przekaż ją do czegoś takiego jak funkcja xxencode :
Pisanie tej funkcji jest nieco podatne na błędy; musisz przesuwać i łączyć bajty w razie potrzeby, aby uzyskać np. 6 bitów na raz, a następnie przełożyć na odpowiedni znak. Osobiście starałbym się wyłudzić czyjś kod, chyba że robiłem to dla „zabawy” (i prawdopodobnie potrzebowałbym do tego pakietu testowego).
Nigdy nie lekceważ potęgi starej szkoły
struct
we właściwych miejscach. Wykorzystaliśmy go tutaj w przypadku gier GBA i DS.źródło
XML jest dobry dla dokumentów o dowolnej strukturze (elementy mogą pojawiać się na różnych poziomach drzewa) lub do osadzania w obcym formacie (np. Umieszczanie svg na stronie xhtml). Jeśli nie masz tych wymagań, jest to naprawdę nieefektywny format i preferowane jest coś prostszego, np. Csv lub json.
źródło