Blog Tworzę grę o piratach #4 - Zapisywanie stanu gry
Post
Anuluj

Tworzę grę o piratach #4 - Zapisywanie stanu gry

Czy umarłem? Nie, ale dostałem diagnozę ADHD, co tłumaczy, dlaczego zaczynam coś i nie kończę. Na szczęście gra nadal powstaje, mimo mojej niewielkiej aktywności w internecie.

Przechodząc do sedna, postanowiłem zaimplementować mechanizm zapisywania i wczytywania stanu gry. Wydawało się to proste, ale niestety nie w moim przypadku. W trakcie tworzenia prototypu nie zastanawiałem się zbyt wiele nad architekturą, a to okazało się błędem.

Co dokładnie miałem na myśli? Przy zapisywaniu stanu gry musiałem uwzględnić wiele różnych elementów związanych ze statkami (pozycja, prędkość, działka, atakowany obiekt, atakujący), a także pociski i stany drzew behawioralnych. Niestety, te dane były rozproszone po różnych miejscach w kodzie, co prowadziło do spaghetti code. Postanowiłem naprawić swoje błędy i zastosować wzorzec ECS (Entity Component System), dostosowując go do specyfiki silnika Defold.

Teraz każdy obiekt w grze jest reprezentowany jako Entity posiadający unikalne ID. Dodatkowo wprowadziłem entities state, gdzie zgromadziłem wszystkie obiekty, które powinny być zapisane. Teraz użytkownik może kliknąć magiczny przycisk “Zapisz”, a kod przetworzy wszystkie entities, wywołując funkcję serialize() na każdym z nich, która zwraca dane do zapisania w formacie JSON :)

Ogólnie rzecz biorąc, te entities reprezentują dane obiektów, a systemy przetwarzają je dalej. Na przykład system odpowiedzialny za ataki (attack_system) nie musi wiedzieć, jak dokładnie wygląda atakujący obiekt. Sprawdza tylko, czy dany entity posiada moduł Cannons, a jeśli tak, to wystrzeliwuje z działek pociski. To generyczne podejście bardzo mi się podoba – kod jest teraz przejrzysty i łatwo go rozbudować o kolejne obiekty.

Wieża która będą strzelać? Żaden problem! Wystarczy dodać klasę Tower, moduł Cannons, Health oraz AggressionTracker (który śledzi cele ataku i atakujących). Do tego jeszcze tekstury, drzewko behawioralne i gotowe!

A, no i w marcu minął rok od założenia tego bloga – czas płynie szybko!

Ten post jest udostępniony na licencji CC BY-NC-ND 2.0 przez autora.