Este é um seguimento desta pergunta, que eu respondi, mas esta aborda um assunto muito mais específico.
Essa resposta me ajudou a entender o Entity Systems ainda melhor do que o artigo.
Eu li o artigo (sim) sobre os sistemas de entidades e ele me disse o seguinte:
Entidades são apenas uma identificação e uma matriz de componentes (os artigos dizem que armazenar entidades em componentes não é uma boa maneira de fazer as coisas, mas não fornece uma alternativa).
Componentes são pedaços de dados que indicam o que pode ser feito com uma determinada entidade.
Sistemas são os "métodos", eles realizam manipulação de dados nas entidades.
Isso parece realmente prático em muitas situações, mas a parte de componentes serem apenas classes de dados está me incomodando. Por exemplo, como eu poderia implementar minha classe Vector2D (Position) em um sistema de entidades?
A classe Vector2D contém dados: coordenadas x e y, mas também possui métodos , que são cruciais para sua utilidade e distinguem a classe de apenas uma matriz de dois elementos. Exemplo métodos são: add()
, rotate(point, r, angle)
, substract()
, normalize()
, e todos os outros padrão, métodos úteis, e absolutamente necessário que as posições (que são exemplos da classe Vector2D) deve ter.
Se o componente fosse apenas um detentor de dados, não seria possível ter esses métodos!
Uma solução que provavelmente poderia aparecer seria implementá-los dentro de sistemas, mas isso parece muito contra-intuitivo. Esses métodos são coisas que eu quero executar agora , que estejam completos e prontos para uso. Não quero esperar pela MovementSystem
leitura de um conjunto caro de mensagens que a instruem a executar um cálculo na posição de uma entidade!
E, o artigo afirma claramente que apenas os sistemas devem ter alguma funcionalidade, e a única explicação para isso, que eu pude encontrar, foi "evitar OOP". Antes de tudo, não entendo por que devo me abster de usar métodos em entidades e componentes. A sobrecarga de memória é praticamente a mesma e, quando acoplada aos sistemas, deve ser muito fácil de implementar e combinar de maneiras interessantes. Os sistemas, por exemplo, só poderiam fornecer lógica básica para entidades / componentes que conhecem a implementação por si mesmos. Se você me perguntar - isso é basicamente pegar os presentes do ES e OOP, algo que não pode ser feito de acordo com o autor do artigo, mas para mim parece uma boa prática.
Pense nisso desta maneira; existem muitos tipos diferentes de objetos desenháveis em um jogo. Imagens antigas simples, animações ( update()
, getCurrentFrame()
etc), combinações desses tipos primitivos e todos eles poderiam simplesmente fornecer um draw()
método ao sistema de renderização, que não precisa se preocupar com a maneira como o sprite de uma entidade é implementado. sobre a interface (desenho) e a posição. E então, eu precisaria apenas de um sistema de animação que chamaria métodos específicos de animação que nada têm a ver com a renderização.
E apenas mais uma coisa ... Existe realmente uma alternativa para matrizes quando se trata de armazenar componentes? Não vejo outro lugar para os componentes serem armazenados além de matrizes dentro de uma classe Entity ...
Talvez essa seja uma abordagem melhor: armazene componentes como propriedades simples de entidades. Por exemplo, um componente de posição seria colado entity.position
.
A única outra maneira seria ter algum tipo de tabela de pesquisa estranha dentro dos sistemas, que referencia diferentes entidades. Mas isso parece muito ineficiente e mais complicado de desenvolver do que simplesmente armazenar componentes na entidade.