Czytałem o Entity System Frameworks, w szczególności Artemis. Próbuję zdecydować, czy jest to dla mnie odpowiednie. Ściśle pracuję nad grami opartymi na kafelkach 2d pixel art i nie sądzę, aby kiedykolwiek były tak wymagające pod względem zasobów. W przeszłości zawsze korzystałem ze standardowego OOP z dużym dziedzictwem.
Moje rozumienie frameworku Entity System Framework w tej chwili (nie jestem pewien, czy rozumiem go całkowicie):
- Podmioty są niczym innym jak dowodem osobistym
- Komponenty to nic innego jak głupie dane dodane do puli komponentów encji
- Systemy to funkcje aktualizacji, które są dołączone do świata, aby obsłużyć każdy byt pasujący do podpisu komponentu System
Jeśli moje rozumowanie jest poprawne, mam problem z koncepcją dodania map tilem i drzew behawioralnych AI do tego frameworka. W przyszłości zapytam o AI.
Czy mapa ramowa powinna być wbudowana w te ramy? A może powinien być oddzielny, aby ułatwić generowanie za pomocą edytora tilemap?
Jeśli mapa tilem powinna być wbudowana w ten szkielet, czy każdy kafelek jest inną jednostką? A tilemap to system? Czy też sama mapa tilem jest pojedynczym bytem, na którym zbudowano dziedzictwo?
Jeśli mapa tilemowa jest sferyczna, jaki byłby najlepszy sposób wykrywania jednostek kolizji z zewnętrzną mapą tilemap?
Rozumiem, że wiele opcji, które wymieniłem, może być poprawnych, ale jeśli ktoś zrobił to w przeszłości, może rzucić nieco światła na moje zamieszanie. Może jest inna alternatywa, o której nie myślałem?
Dziękuję Ci.
źródło
Odpowiedzi:
Zaimplementowałem framework komponentu encji (podobny do Artemidy) po tym, jak byłem już w fazie projektowania, ale nie sądzę, że zrobiłbym inaczej, gdybym zaczął od pustej tablicy.
Mój świat jest całkowicie oddzielony od struktury bytu. Po prostu nie miało dla mnie sensu przekształcanie świata w jakiś byt lub zbiór bytów. Mój świat jest trójwymiarowy z kostkami, ale uważam, że to samo dotyczy płytek. Istoty tworzą wszystko inne na świecie, ale teren jest odrębny. Jednak po usunięciu kostek odradzają się „materialne” byty.
Wykrywanie kolizji nie jest zbyt trudne do powiązania. Twój świat prawdopodobnie miałby
isSolidAt(x,y)
metody typu, które wykorzysta Twój system kolizji. Uczciwość, powiedziałem to już dziś w innej odpowiedzi , rób wszystko, co jest dla ciebie najbardziej sensowne. Nie łamiesz żadnych zasad, oddzielając mapę kafelków lub tworząc z niej byt. Cokolwiek możesz owinąć głową, jest najlepsze. Dla mnie to utrzymywało świat osobno i tworzyło wszystko inne byty.źródło
isSolidAt
metody mapy ?Dodałem tilemap jako osobny komponent do encji (ze wszystkimi kafelkami w środku) i istnieje również osobny renderer dla mapy kafelków, dzięki czemu mogę renderować go w 3d lub 2d. Tworzenie wszystkich kafelków jako jednostek jest możliwe, ale zbyt drogie.
coś w tym stylu:
Korzyścią z oddzielenia rysunku od logiki jest podstawowa idea wzoru MVC
źródło