Tentando entender as maneiras de lidar adequadamente com a colisão em um jogo projetado em torno de componentes.
Vejo que muitos exemplos são PhysicsComponent
adicionados à lista de componentes da entidade, mas a implementação real está me confundindo.
Para que isso funcione, PhysicsComponent
seria necessário acessar o mundo ao seu redor. Isso não faz sentido para mim. Um componente não deveria desconhecer não apenas seu contêiner (a entidade), mas também o contêiner de seu contêiner (o mundo)?
Para mim, parece que o nível ou a cena deve manter uma lista dessas entidades e a cada atualização do jogo, percorrer as entidades para determinar qual colisão.
Minha pergunta é em primeiro lugar, se isso é bom ou não, e em segundo lugar, como determinar quais entidades podem colidir. Suponho que entidades sólidas possam implementar uma interface IRigidBody vazia, para que o nível possa determinar quais entidades na lista suportam colisão. Mas isso está quebrando o design do componente?
Em vez disso, eles devem conter um componente RigidBody vazio? Na verdade, isso pode ser melhor porque nem sempre está vazio e essa abordagem é mais à prova de futuro. O único problema com isso é a complexidade. A cena teria que percorrer não apenas todas as entidades, mas também os componentes de todas as entidades para determinar se ele tinha esse componente RigidBody.
Em terceiro lugar, quando colidem, ambas as entidades devem ser informadas de alguma forma e também não tenho certeza de como fazer isso.
Digamos que ambas as entidades contivessem um HealthComponent e, quando colidissem, sua saúde seria diminuída por algum valor arbitrário, 5. Suponho que seria responsabilidade da cena lidar com isso quando detectar uma colisão entre duas entidades?
Mas então a cena é responsável por demais? Eu pude ver isso possivelmente ficando fora de controle e se tornando pesado quando a cena é responsável por muitas coisas que as entidades não deveriam (?) Ter acesso.
Editar: pergunta atualizada com mais detalhes.