Tilemaps dans un Entity System Framework?

12

J'ai lu des informations sur les cadres du système d'entité, en particulier Artemis. J'essaie de décider si c'est bon pour moi. Je travaille strictement sur des jeux de pixel art 2D basés sur des tuiles, et je ne pense pas qu'ils seront jamais aussi gourmands en ressources. J'ai toujours utilisé la POO standard avec beaucoup d'héritage dans le passé.

Ma compréhension du Entity System Framework en ce moment (je ne sais pas si je le sais complètement) est:

  • Les entités ne sont que des identifiants
  • Les composants ne sont que des données stupides ajoutées à un pool de composants d'entités
  • Les systèmes sont des fonctions de mise à jour qui sont attachées au monde pour gérer chaque entité qui correspond à la signature du composant Systems

Si ma compréhension est correcte, j'ai un peu de mal à conceptualiser l'ajout de tilemaps et d'arbres comportementaux AI dans ce cadre. Je vais poser des questions sur l'IA à l'avenir.

Un tilemap doit-il être intégré à ce cadre? Ou doit-il être séparé pour le rendre facile à générer avec un éditeur de tilemap?

Si le tilemap doit être intégré à ce cadre, chaque tuile est-elle une entité différente? Et le tilmap un système? Ou le tilemap lui-même est-il une entité unique dont l'héritage est construit à partir de lui?

Si le tilemap est spéré, quel serait le meilleur moyen de détecter les collisions avec le tilemap externe?

Je comprends que plusieurs options que j'ai énumérées pourraient être correctes, mais si quelqu'un l'a fait dans le passé, il pourrait être en mesure de faire la lumière sur ma confusion. Peut-être y a-t-il une autre alternative à laquelle je n'ai pas pensé?

Je vous remercie.

Spencer Marr
la source
Une note complètement aléatoire, les coordonnées X / Y fonctionnent également comme ID. Non pas que je vous suggère de l'implémenter dans votre système d'entités, mais plutôt, vous pouvez attacher des effets à vos tuiles de la même manière que vous le feriez dans un système d'entités.
William Mariager
Hé, je passe juste la suggestion de Byte56: les composants n'ont pas vraiment besoin d'être des détenteurs de données stupides. Parfois, il serait utile qu'ils puissent réellement exploiter ces données; vecteurs, par exemple.
jcora
J'aime aussi beaucoup cette suggestion. Je peux ajouter des tilemaps dans le framework d'entité sans avoir à séparer les assistants de tilemap des données, ni à diviser le tilemap en plusieurs composants / entités.
Spencer Marr
Tilemap n'est qu'un autre composant, et le système de collision et le système de rendu gèrent les collisions avec tilemap et le rendu de tilemap
Kikaimaru

Réponses:

8

J'ai implémenté un framework de composants d'entité (similaire à Artemis) après avoir déjà été en développement pendant un certain temps, mais je ne pense pas que j'aurais fait les choses différemment si je partais d'une liste vierge.

J'ai mon monde totalement séparé du cadre d'entité. Cela n'avait tout simplement pas de sens pour moi de convertir le monde en une sorte d'entité ou de collection d'entités. Mon monde est en 3D avec des cubes, mais je pense que c'est la même chose pour les tuiles. Les entités constituent tout le reste du monde, mais le terrain est séparé. Cependant, lorsque des cubes sont supprimés, ils engendrent des entités "matérielles".

La détection de collision n'est pas trop difficile à relier. Votre monde aurait probablement des isSolidAt(x,y)méthodes de type que votre système de collision utilisera. Honnêtement, je l'ai déjà dit aujourd'hui dans une réponse différente , faites ce qui vous semble le plus logique. Vous n'enfreignez aucune règle en séparant la carte de tuiles ou en en faisant une entité. Tout ce que vous pouvez envelopper, c'est ce qui est le mieux. Pour moi, c'était garder le monde séparé et faire de tout le reste des entités.

MichaelHouse
la source
1
Disons que ma carte est une entité. Comment une autre entité pourrait-elle accéder à la méthode de la carte isSolidAt?
Gerardo Marset
Stocker la carte en tant qu'entité n'est probablement pas une excellente idée pour cette situation. Je suppose que vous devez communiquer directement avec lui dans cette situation. Le système en charge de l'entité cartographique aurait accès à l'entité cartographique et serait en mesure de récupérer des informations de cette entité sur demande.
MichaelHouse
4

J'ai ajouté tilemap en tant que composant distinct à l'entité (avec toutes les tuiles à l'intérieur) et il y a aussi un moteur de rendu séparé pour la carte des tuiles, donc je peux le rendre en 3D ou en 2D. Créer toutes les tuiles en tant qu'entités est possible mais trop cher.

quelque chose comme ca:


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

l'avantage de séparer le dessin de la logique est l'idée de base du modèle MVC

Yevhen
la source
1
Le tilemap entier est contenu dans un seul composant? Est-il attaché à une sorte d'entité d'environnement de jeu / entité maître? Je peux voir un avantage assez important en séparant le moteur de rendu du composant tilemap.
Spencer Marr
Merci d'avoir mis à jour votre réponse! J'adore les extraits de code.
Spencer Marr