Diluindo SEC


Commission: Mad Scientist by Culpeo-Fox on DeviantArt

Neste artigo descreverei aproximadamente o padrão ECS e minha implementação no Flame Steel Engine Game Toolkit. O padrão Entity Component System é usado em jogos, incl. no motor Unity. Cada objeto no jogo é uma Essência preenchida com Componentes.  Por que isso é necessário se existe POO?
Em seguida, altere as propriedades, comportamento e exibição de objetos diretamente durante a execução do jogo. Essas coisas não são encontradas em aplicativos do mundo real; a dinâmica de alteração de parâmetros, propriedades de objetos, exibição e som é mais característica de jogos do que de software de contabilidade.


Não passamos bananas

Digamos que temos uma classe de banana em nosso jogo. E o designer do jogo queria que as bananas fossem usadas como armas. Digamos que na arquitetura atual as bananas não tenham nada a ver com armas. Fazendo de uma banana uma arma? Fazer todos os itens armas?
A ECS oferece uma solução para este problema premente – Todos os objetos do jogo devem consistir em componentes. Anteriormente banana era a classe Banana, agora faremos ela, e todos os outros objetos, a classe Entity, adicionando componentes a eles. Digamos que uma banana agora consiste nos seguintes componentes:

  1. Componente de posição (coordenadas no mundo do jogo – x, y, z)
  2. Componente de rotação (coordenadas x, y, z)
  3. Componente calórico de uma banana (o personagem principal não deve engordar muito)
  4. Componente de imagem de banana

Agora estamos adicionando um novo componente para todas as bananas, que é um sinalizador de que elas podem ser usadas como arma – Componente de arma. Agora, quando o sistema do jogo vê que um jogador se aproximou de uma banana, ele verifica a presença de um componente de arma na banana e, se isso acontecer, arma o jogador com uma banana.
No meu jogo Flame Steel Call Of The Death Mask, o padrão ECS é usado por toda parte. Os objetos são compostos de componentes e os próprios componentes podem conter componentes. Em geral, dividir o objeto < – > o componente está faltando na minha implementação, mas isso é até uma vantagem.

screenshot_2016-09-24_14-33-43

A espingarda nesta captura de tela é um componente do jogador e, ao mesmo tempo, a segunda espingarda simplesmente fica pendurada no mapa do jogo como um objeto comum.
Nesta captura de tela, há dois sistemas em execução – renderizador de cena e renderizador de interface. O renderizador de cena funciona com o componente de imagem shotgun no mapa, o renderizador de interface funciona com o componente de imagem shotgun nas mãos do jogador.

Links relacionados:
https://habrahabr.ru/post/197920/
https://www.youtube.com/watch?v=NTWSeQtHZ9M