Tilemaps en un marco de sistema de entidad?

12

He estado leyendo sobre Entity System Frameworks específicamente Artemis. Estoy tratando de decidir si es adecuado para mí. Trabajo estrictamente en juegos de arte de píxeles 2d basados ​​en mosaicos, y no creo que sean tan intensivos en recursos. Siempre he usado OOP estándar con mucha herencia en el pasado.

Mi comprensión del Entity System Framework en este momento (no estoy seguro si lo entiendo completamente todavía) es:

  • Las entidades no son más que identificaciones
  • Los componentes no son más que datos tontos agregados a un grupo de componentes de entidades
  • Los sistemas son funciones de actualización que están conectadas al mundo para manejar cada entidad que coincida con la firma del componente Sistemas

Si mi comprensión es correcta, entonces estoy teniendo problemas para conceptualizar la adición de mapas de mosaicos y árboles de comportamiento AI en este marco. Preguntaré sobre IA en el futuro.

¿Debería construirse un mosaico en este marco? ¿O debería mantenerse separado para facilitar la generación con un editor de mosaico?

Si el mosaico debe integrarse en este marco, ¿cada mosaico es una entidad diferente? ¿Y el mosaico es un sistema? ¿O es el mosaico en sí una entidad única con herencia construida a partir de él?

Si el mapa de mosaico es sperate, ¿cuál sería la mejor manera de detectar entidades de colisión contra el mapa de mosaico externo?

Entiendo que las múltiples opciones que he enumerado pueden ser correctas, pero si alguien ha hecho esto en el pasado, podrían arrojar algo de luz sobre mi confusión. ¿Quizás hay otra alternativa en la que no he pensado?

Gracias.

Spencer Marr
fuente
Una nota completamente al azar, las coordenadas X / Y también funcionan como ID. No es que sugiera que lo implemente en su sistema de entidades, sino que puede adjuntar efectos a sus mosaicos de la misma manera que lo haría en un sistema de entidades.
William Mariager
Oye, solo pasando la sugerencia de Byte56: los componentes realmente no necesitan ser titulares de datos tontos. A veces sería útil si realmente pudieran operar esos datos; vectores, por ejemplo.
jcora
Realmente me gusta esta sugerencia también. Puedo agregar mapas de mosaicos en el marco de la entidad sin tener que separar los ayudantes de mapa de mosaicos de los datos, o tener que dividir el mapa de mosaicos en múltiples componentes / entidades.
Spencer Marr
Tilemap es solo otro componente, y el sistema de colisión y el sistema de procesamiento manejan las colisiones con tilemap y la representación de tilemap
Kikaimaru

Respuestas:

8

Implementé un marco de componentes de entidad (similar a Artemis) después de haber estado en desarrollo durante un tiempo, pero no creo que hubiera hecho las cosas de manera diferente si comenzara desde una pizarra en blanco.

Tengo mi mundo totalmente separado del marco de la entidad. Simplemente no tenía sentido para mí convertir el mundo en algún tipo de entidad o colección de entidades. Mi mundo es 3D con cubos, pero creo que lo mismo se aplica a los mosaicos. Las entidades componen todo lo demás en el mundo, pero el terreno está separado. Sin embargo, cuando se eliminan los cubos, generan entidades "materiales".

La detección de colisión no es demasiado difícil de vincular. Es probable que su mundo tenga isSolidAt(x,y)métodos de tipo que utilizará su sistema de colisión. Honestidad, ya dije esto una vez hoy en una respuesta diferente , haz lo que tenga más sentido para ti. No está rompiendo ninguna regla al separar el mapa de mosaicos o al convertirlo en una entidad. Lo que sea que puedas entender es lo mejor. Para mí, eso era mantener el mundo separado y hacer de todo lo demás entidades.

MichaelHouse
fuente
1
Digamos que mi mapa es una entidad. ¿Cómo haría otra entidad para acceder al isSolidAtmétodo del mapa ?
Gerardo Marset
Almacenar el mapa como una entidad probablemente no sea una gran idea solo para esta situación. Supongo que tienes que comunicarte directamente con él en esta situación. El sistema a cargo de la entidad del mapa tendrá acceso a la entidad del mapa y podrá recuperar información de esa entidad cuando se solicite.
MichaelHouse
4

Agregué el mapa de mosaico como un componente separado de la entidad (con todos los mosaicos dentro) y también hay un renderizador separado para el mapa de mosaico, por lo que puedo representarlo en 3d o en 2d. Crear todos los mosaicos como entidades es posible pero costoso.

algo como eso:


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

El beneficio de separar el dibujo de la lógica es la idea básica del patrón MVC

Yevhen
fuente
1
Todo el mapa de mosaico está contenido dentro de un solo componente? ¿Está unido a algún tipo de entidad de entorno de juego / entidad maestra? Puedo ver un beneficio bastante grande obtenido al separar el renderizador del componente tilemap.
Spencer Marr
¡Gracias por actualizar tu respuesta! Me encantan los fragmentos de código.
Spencer Marr