Tilemaps w systemie Entity System?

12

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.

Spencer Marr
źródło
Zupełnie losowa uwaga, współrzędne X / Y również działają jako identyfikatory. Nie dlatego, że sugeruję zaimplementowanie go w systemie encji, ale raczej możesz dołączyć efekty do swoich kafelków w taki sam sposób, jak w systemie encji.
William Mariager
Hej, właśnie przekazuję sugestię Byte56: komponenty tak naprawdę nie muszą być głupimi posiadaczami danych. Czasami przydałoby się, gdyby mogli faktycznie obsługiwać te dane; na przykład wektory.
jcora
Bardzo podoba mi się również ta sugestia. Mogę dodawać mapy tilemap do struktury encji bez konieczności oddzielania pomocników tilemap od danych lub konieczności dzielenia mapy tilemap na wiele komponentów / encji.
Spencer Marr
Tilemap to tylko kolejny element, a system kolizji i system renderujący obsługuje kolizje z tilemapem i renderowaniem tilemapu
Kikaimaru

Odpowiedzi:

8

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.

MichaelHouse
źródło
1
Powiedz, że moja mapa jest bytem. W jaki sposób inny byt zająłby się dostępem do isSolidAtmetody mapy ?
Gerardo Marset
Przechowywanie mapy jako bytu prawdopodobnie nie jest dobrym pomysłem na taką sytuację. Podejrzewam, że w tej sytuacji musisz się z nim bezpośrednio skontaktować. System odpowiedzialny za jednostkę mapy miałby dostęp do jednostki mapy i byłby w stanie uzyskać informacje z tej jednostki, gdy zostanie o to poproszony.
MichaelHouse
4

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:


Entity e("map");
e.addComponent(new Tilemap("1.xml"));
e.addComponent(new TilemapRenderer2d(graphics));

tile map is something like that
class Tilemap
{
  array of tiles;
  getTileAtPosition(); 
  isWalkable ; etc;
}

class ITilemapRenderer
{}

class TilemapRenderer2d
{
draw() 
{ 
  foreach (tile in owner()->component()->tiles()) 
  {
    if (tile == ground) ground_sprite->draw() ....
  }
}

Korzyścią z oddzielenia rysunku od logiki jest podstawowa idea wzoru MVC

Jewhen
źródło
1
Cała mapa tilem jest zawarta w jednym elemencie? Czy jest dołączony do jakiegoś elementu środowiska gry / obiektu głównego? Widzę dość dużą korzyść uzyskaną dzięki oddzieleniu renderera od komponentu tilemap.
Spencer Marr
Dziękujemy za aktualizację odpowiedzi! Uwielbiam fragmenty kodu.
Spencer Marr