Tilemaps in einem Entity System Framework?

12

Ich habe über Entity System Frameworks speziell Artemis gelesen. Ich versuche zu entscheiden, ob es für mich richtig ist. Ich arbeite streng an auf Kacheln basierenden 2D-Pixelkunstspielen, und ich glaube nicht, dass sie jemals so ressourcenintensiv sein werden. Ich habe in der Vergangenheit immer Standard-OOP mit viel Vererbung verwendet.

Mein Verständnis des Entity System Framework im Moment (ich bin mir nicht sicher, ob ich es noch vollständig verstehe) ist:

  • Entitäten sind nichts als IDs
  • Komponenten sind nichts anderes als dumme Daten, die einem Entitätskomponentenpool hinzugefügt werden
  • Systeme sind Aktualisierungsfunktionen, die mit der Welt verbunden sind, um jede Entität zu verarbeiten, die der Systems-Komponentensignatur entspricht

Wenn mein Verständnis stimmt, habe ich einige Probleme damit, Tilemaps und AI Behavioral Trees in dieses Framework einzufügen. Ich werde in Zukunft nach AI fragen.

Sollte eine Tilemap in dieses Framework eingebaut werden? Oder sollte es separat gehalten werden, um die Erstellung mit einem Tilemap-Editor zu vereinfachen?

Wenn die Kachelkarte in dieses Framework integriert werden soll, ist jede Kachel eine andere Entität? Und die Tilemap ein System? Oder ist die Tilemap selbst eine einzelne Entität, auf der die Vererbung aufbaut?

Wenn die Tilemap sperat ist, wie lassen sich Kollisionserkennungsobjekte am besten mit der externen Tilemap vergleichen?

Ich verstehe, dass mehrere Optionen, die ich aufgelistet habe, möglicherweise richtig sind, aber wenn jemand dies in der Vergangenheit getan hat, kann er möglicherweise etwas Licht in meine Verwirrung bringen. Vielleicht gibt es eine andere Alternative, an die ich nicht gedacht habe?

Vielen Dank.

Spencer Marr
quelle
Eine völlig zufällige Notiz, X / Y-Koordinaten funktionieren auch als IDs. Ich schlage nicht vor, dass Sie es in Ihrem Entitätssystem implementieren, sondern Sie können Effekte auf die gleiche Weise an Ihre Kacheln anhängen, wie Sie es in einem Entitätssystem tun würden.
William Mariager
Hey, ich gebe nur den Vorschlag von Byte56 weiter: Komponenten müssen eigentlich keine dummen Datenhalter sein. Manchmal wäre es nützlich, wenn sie diese Daten tatsächlich verarbeiten könnten. Vektoren zum Beispiel.
Jcora
Ich mag diesen Vorschlag auch sehr. Ich kann dem Entity-Framework Tilemaps hinzufügen, ohne die Tilemap-Helfer von den Daten trennen oder die Tilemap in mehrere Komponenten / Entities aufteilen zu müssen.
Spencer Marr
Tilemap ist nur eine weitere Komponente, und das Kollisions- und Renderersystem verarbeitet Kollisionen mit Tilemap und Rendering von Tilemap
Kikaimaru,

Antworten:

8

Ich habe ein Entity-Component-Framework (ähnlich wie Artemis) implementiert, nachdem ich bereits eine Weile in der Entwicklung war, aber ich glaube nicht, dass ich die Dinge anders gemacht hätte, wenn ich von einer leeren Tafel ausgegangen wäre.

Ich habe meine Welt völlig getrennt vom Entity-Framework. Es machte für mich einfach keinen Sinn, die Welt in eine Art Einheit oder eine Sammlung von Einheiten zu verwandeln. Meine Welt ist 3D mit Würfeln, aber ich glaube, dasselbe gilt für Fliesen. Wesenheiten machen alles andere auf der Welt aus, aber das Terrain ist getrennt. Wenn Würfel jedoch entfernt werden, erzeugen sie "materielle" Entitäten.

Die Kollisionserkennung ist nicht allzu schwierig. In Ihrer Welt gibt es wahrscheinlich isSolidAt(x,y)Typmethoden, die Ihr Kollisionssystem verwenden wird. Ehrlichkeit, das habe ich schon heute einmal in einer anderen Antwort gesagt , tu, was für dich am sinnvollsten ist. Sie verletzen keine Regeln, indem Sie die Kachelzuordnung trennen oder zu einer Entität machen. Was auch immer Sie Ihren Kopf herumwickeln können, ist das Beste. Für mich bedeutete das, die Welt getrennt zu halten und alles andere zu einer Einheit zu machen.

MichaelHouse
quelle
1
Angenommen, meine Karte ist eine Entität. Wie würde eine andere Entität vorgehen, um auf die Kartenmethode zuzugreifen isSolidAt?
Gerardo Marset
Das Speichern der Karte als Ganzes ist in dieser Situation wahrscheinlich keine gute Idee. Ich nehme an, Sie müssen in dieser Situation direkt damit kommunizieren. Das System, das für die Kartenentität verantwortlich ist, hat Zugriff auf die Kartenentität und kann auf Anforderung Informationen von dieser Entität abrufen.
MichaelHouse
4

Ich habe tilemap als separate Komponente zur Entität hinzugefügt (mit allen darin enthaltenen Kacheln) und es gibt auch einen separaten Renderer für die Kachelkarte, sodass ich sie in 3d oder in 2d rendern kann. Alle Kacheln als Entitäten zu erstellen ist möglich aber zu teuer.

sowas in der Art:


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() ....
  }
}

Der Vorteil der Trennung von Zeichnung und Logik ist die Grundidee des MVC-Musters

Yevhen
quelle
1
Die gesamte Tilemap ist in einer einzigen Komponente enthalten? Ist es an eine Art Spielumgebungsentität / Master-Entität gebunden? Ich sehe einen ziemlich großen Vorteil, wenn ich den Renderer von der Tilemap-Komponente trenne.
Spencer Marr
Vielen Dank für die Aktualisierung Ihrer Antwort! Ich liebe Code-Schnipsel.
Spencer Marr