Sei que essa pergunta foi feita várias vezes, mas ainda não sei como implementar a manipulação de entrada em um mecanismo baseado em componente.
O design baseado em componentes que usei foi baseado na série de blogs da T = Machine e na Artemis, na qual as Entidades são apenas identificações.
Existem três idéias principais que tenho na implementação do tratamento de entradas:
- O componente de entrada conterá eventos de seu interesse. O sistema de entrada converterá os eventos de chave e mouse em eventos do jogo e percorrerá as entidades com o componente de entrada e, se estiverem interessados no evento, uma ação apropriada será executada pelo sistema de entrada. Essa ação seria codificada no sistema de entrada.
- Nenhum componente de entrada. Você registraria entidades com eventos específicos no sistema de entrada. O sistema de entrada enviaria mensagens (com o ID da entidade e o tipo de evento) para outros sistemas, para que eles possam executar a ação apropriada. Ou, como no primeiro caso, as ações seriam codificadas no sistema de entrada.
- Semelhante ao primeiro método, mas, em vez de codificar a ação no sistema de entrada, o componente conteria um mapa de eventos para funções (ie
std::map<std::function>
) que seriam chamadas pelo sistema de entrada. Isso tem o efeito adicional de poder acoplar o mesmo evento a ações diferentes.
Você recomendaria algum dos métodos acima ou tem alguma sugestão que me ajudasse a implementar um sistema flexível de manipulação de entradas? Além disso, ainda não estou familiarizado com o multi-threading, mas todas as sugestões que tornem a implementação compatível com threads também são bem-vindas.
Nota: Um requisito adicional que eu gostaria que a implementação cumprisse é que eu seria capaz de passar a mesma entrada para muitas entidades, como, por exemplo, mover uma entidade de câmera e o player ao mesmo tempo.