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!