Tilemaps em uma estrutura de sistema de entidades?


12

Eu tenho lido sobre Entity System Frameworks especificamente Artemis. Estou tentando decidir se é certo para mim. Eu trabalho estritamente em jogos de arte em pixel 2D baseados em blocos e acho que eles nunca serão tão intensivos em recursos. Eu sempre usei OOP padrão com muita herança no passado.

Meu entendimento do Entity System Framework agora (não tenho certeza se o compreendo completamente ainda) é:

  • Entidades não passam de IDs
  • Componentes nada mais são que dados estúpidos adicionados a um pool de componentes de entidades
  • Sistemas são funções de atualização anexadas ao mundo para manipular todas as entidades que correspondem à assinatura do componente Sistemas

Se meu entendimento estiver correto, estou tendo um pouco de dificuldade em conceituar a adição de mapas de mosaico e árvores comportamentais da IA ​​a essa estrutura. Vou perguntar sobre IA no futuro.

Um mapa de mosaico deve ser incorporado a essa estrutura? Ou deve ser mantido separado para facilitar a geração com um editor de mapa de peças?

Se o tilemap deve ser incorporado nessa estrutura, cada tile é uma entidade diferente? E o tilemap de um sistema? Ou o próprio mapa da telha é uma entidade única com herança criada a partir dele?

Se o mapa de mosaico estiver separado, qual seria a melhor maneira de detectar colisões de entidades no mapa de mosaico externo?

Entendo que várias opções que listei podem estar corretas, mas se alguém já fez isso no passado, poderá esclarecer minha confusão. Talvez haja outra alternativa em que eu não tenha pensado?

Obrigado.


Uma nota completamente aleatória, as coordenadas X / Y também funcionam como IDs. Não que eu esteja sugerindo que você o implemente em seu sistema de entidades, mas sim, você pode anexar efeitos aos seus blocos da mesma maneira que faria em um sistema de entidades.
William Mariager

Ei, apenas passando a sugestão do Byte56: os componentes realmente não precisam ser detentores de dados. Às vezes, seria útil se eles pudessem realmente operar esses dados; vetores, por exemplo.
jcora

Eu realmente gosto dessa sugestão também. Posso adicionar mapas de mosaico à estrutura da entidade sem ter que separar os auxiliares do mapa de mosaico dos dados ou ter que dividir o mapa de mosaico em vários componentes / entidades.
Spencer Marr

TileMap é apenas mais um componente, e alças de sistema de colisão e sistema renderizador colisões com TileMap e prestação de TileMap
Kikaimaru

Respostas:


8

Implementei uma estrutura de componente de entidade (semelhante à Artemis) depois de já estar em desenvolvimento há algum tempo, mas acho que não teria feito as coisas de maneira diferente se partisse de uma folha em branco.

Eu tenho meu mundo totalmente separado da estrutura da entidade. Para mim, não fazia sentido converter o mundo em algum tipo de entidade ou coleção de entidades. Meu mundo é 3D com cubos, mas acredito que o mesmo se aplica aos ladrilhos. As entidades compõem todo o resto do mundo, mas o terreno é separado. No entanto, quando os cubos são removidos, eles geram entidades "materiais".

A detecção de colisão não é muito difícil de se conectar. Seu mundo provavelmente teria isSolidAt(x,y)métodos de tipo que seu sistema de colisão utilizará. Honestidade, eu já disse isso uma vez hoje em uma resposta diferente , faça o que fizer mais sentido para você. Você não está violando nenhuma regra, separando o mapa de blocos ou tornando-o uma entidade. Tudo o que você pode entender é o melhor. Para mim, isso era manter o mundo separado e transformar todo o resto em entidades.


1
Digamos que meu mapa seja uma entidade. Como outra entidade processaria o isSolidAtmétodo do mapa ?
Gerardo Marset 04/10

Armazenar o mapa como uma entidade provavelmente não é uma boa idéia apenas para esta situação. Suponho que você precise se comunicar diretamente com ele nessa situação. O sistema encarregado da entidade do mapa teria acesso à entidade do mapa e poderá recuperar informações dessa entidade quando solicitado.
Michaelhouse

4

Adicionei tilemap como um componente separado para a entidade (com todos os tiles dentro) e também há renderizador separado para o mapa de tile, para que eu possa renderizá-lo em 3d ou em 2D. Criar todos os blocos como entidades é possível, mas caro.

algo parecido:


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

O benefício em separar o desenho da lógica é a ideia base do padrão MVC


1
O mapa de mosaico inteiro está contido em um único componente? Ele está anexado a algum tipo de entidade do ambiente de jogo / entidade principal? Eu posso ver um grande benefício obtido ao separar o renderizador do componente tilemap.
Spencer Marr

Obrigado por atualizar sua resposta! Eu amo trechos de código.
Spencer Marr
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.