Minha pergunta é:
Como posso lidar com estados de jogos no meu sistema de entidades, sem recorrer a manter uma pilha de objetos de estado de jogos?
Portanto, o design do meu sistema de entidades significa que, quando uma entidade precisa se registrar para eventos de entrada, por exemplo, o componente de entrada chama o sistema de entrada e diz "registrar esta entidade para esta entrada". Está tudo bem, mas se você adicionar a isso o conceito de estados do jogo (digamos, uma tela de pausa), torna-se um problema descobrir se uma entidade está no estado atual e deve receber a entrada.
Eu poderia aumentar o componente / sistema de entrada para que ele diga "registre essa entidade para esta entrada enquanto estiver nesses estados de jogo", mas isso exige que toda entidade saiba em quais estados será usada e isso pode não ser óbvio. Além disso, manter uma lista de estados de jogos por entrada registrada (e outros sistemas que usam retornos de chamada) não parece muito eficiente.
Outra idéia que tive foi que haverá uma entidade que representa o estado do jogo, marque-a como desativada e, ao gerar o evento de entrada, verifique se a entidade não é descendente de uma entidade do estado do jogo desativada. Parece caro determinar o pai para cada retorno de chamada.
Outra idéia é fazer com que todos os sistemas armazenem seus dados digitados no estado atual; dessa forma, ao gerar a entrada, a entidade de destino nem será candidata. No entanto, isso realmente prejudica a capacidade de permitir a comunicação entre entidades em diferentes estados (não é um problema para as telas de pausa, mas acho que a trava no Oblivion / Skyrim).
A única outra idéia que tive é que todos os componentes lidem com eventos de mudança de estado e se comuniquem com seu sistema relevante para desativar qualquer coisa que eles tenham registrado e reativá-lo ao voltar para esse estado.
A segunda (marcar um objeto como desativado) e a seguir (cada componente lida com mudanças de estado) parecem ser as melhores de minhas idéias, mas nenhuma delas me impressiona por ser particularmente boa.
Alguém mais tem alguma outra idéia de como fazer isso?
editar Enquanto falo sobre entradas especificamente nesta pergunta, pode significar qualquer sistema capaz de enviar mensagens / eventos para entidades, como colisões, eventos de timer, etc.