Atualmente, estou enfrentando o seguinte problema:
Estou tentando escrever um clone de pong usando um sistema de componentes de entidade (ECS). Eu escrevi a "estrutura" sozinha. Portanto, há uma classe que gerencia as entidades com todos os componentes. Depois, existem as próprias classes de componentes. E por último, existem os meus sistemas que apenas obtêm todas as entidades que possuem componentes de que o sistema precisa.
Por exemplo, meu sistema de movimento procura todas as entidades que possuem um componente de posição e um componente de movimento. O componente de posição mantém apenas a posição e o componente de movimento mantém a velocidade.
Mas o problema real é o meu sistema de colisão. Essa classe é como um blob lógico. Eu tenho muitos casos especiais nesta classe.
Por exemplo: Meus remos podem colidir com as bordas. Se isso acontecer, a velocidade é ajustada para zero. Minha bola também pode colidir com as fronteiras. Mas, neste caso, sua velocidade é espelhada no normal da borda e, portanto, é refletida. Para fazer isso, dei à bola um componente extra de física que diz: "Ei, isso não para, reflete". Então, na verdade, o componente físico não possui dados reais. É uma classe vazia que existe apenas para informar ao sistema se um objeto reflete ou para.
Aí vem o seguinte: quero renderizar algumas partículas quando a bola colidir com os remos ou as bordas. Então eu acho que a bola precisa pegar outro componente que diga ao sistema de colisão para criar partículas em colisão.
Então eu quero ter power-ups que podem colidir com os remos, mas não com as fronteiras. Se isso acontecer, os power-ups terão que desaparecer. Então, eu precisaria de muito mais casos e componentes (para dizer ao sistema que algumas entidades só podem colidir com outras, mas não todas, mesmo que outras possam realmente colidir, além disso, o sistema de colisão teve que aplicar os power-ups para as pás, etc., etc., etc.).
Vejo que o sistema de componentes da entidade é uma coisa boa porque é flexível e você não tem problemas com herança. Mas estou totalmente preso atualmente.
Estou pensando muito complicado? Como devo lidar com esse problema?
Claro, eu tenho que criar sistemas que são realmente responsáveis pela "pós-colisão", para que o sistema de colisão diga apenas "Sim, temos uma colisão no último quadro" e, em seguida, há um monte de sistemas "pós-colisão" que todos exigem componentes diferentes (combinações de) e depois os alteram. Por exemplo, haveria um sistema de movimento pós-colisão que interrompe coisas que precisam parar quando a colisão acontece. Em seguida, um sistema de pós-colisão físico que reflete coisas, etc.
Mas isso também não parece ser uma solução adequada para mim, porque, por exemplo:
- Meu sistema pós-colisão de movimento precisaria de entidades que tenham um componente de posição, um componente de movimento e um componente de colisão. Em seguida, definiria a velocidade da entidade como zero.
- O sistema de pós-colisão da física precisaria de entidades que tenham um componente de posição, um componente de movimento, um componente de colisão e um componente de física. Em seguida, refletiria o vetor de velocidade.
O problema é óbvio: o movimento pós-colisão precisa de entidades que são um subconjunto das entidades no sistema de pós-colisão da física. Portanto, dois sistemas pós-colisão operariam com os mesmos dados, o efeito sendo: Embora uma entidade tenha um componente de física, sua velocidade seria zero após uma colisão.
Como esses problemas são resolvidos em geral em um sistema de componentes da entidade? Esses problemas são comuns ou estou fazendo algo errado? Se sim, o que e como deve ser feito?