Mi pregunta es:
¿Cómo puedo manejar los estados de juego en mi sistema de entidades, sin recurrir a mantener una pila de objetos de estado de juego?
Por lo tanto, el diseño de mi sistema de entidad significa que cuando una entidad necesita registrarse para eventos de entrada, por ejemplo, el componente de entrada llama al sistema de entrada y dice "registrar esta entidad para esta entrada". Todo esto está muy bien, sin embargo, si agrega a esto el concepto de estados del juego (digamos una pantalla de pausa), se convierte en un problema determinar si una entidad está en el estado actual y debe recibir la entrada.
Podría aumentar el componente / sistema de entrada para que diga: "registre esta entidad para esta entrada mientras esté en estos estados del juego", pero esto requiere que cada entidad sepa en qué estados se va a usar, y eso puede no ser obvio. Además, mantener una lista de estados de juego por entrada registrada (y otros sistemas que usan devoluciones de llamada) no parece demasiado eficiente.
Otra idea que tuve es que habrá una entidad que representa el estado del juego, márquelo como deshabilitado, luego, al generar el evento de entrada, verifique que la entidad no sea descendiente de una entidad con estado de juego deshabilitado. Parece costoso trabajar con el padre para cada devolución de llamada.
Otra idea es que todos los sistemas almacenen sus datos en clave contra el estado actual, de esa manera, al generar la entrada, la entidad objetivo ni siquiera será candidata. Sin embargo, esto realmente perjudica la capacidad de permitir la comunicación entre entidades en diferentes estados (no es tanto un problema para las pantallas de pausa, sino pensar en la selección de bloqueo en Oblivion / Skyrim).
La única otra idea que he tenido es que todos los componentes manejen los eventos de cambio de estado y se comuniquen con su sistema relevante para deshabilitar todo lo que hayan registrado y volver a habilitarlo al volver a este estado.
El segundo (marcar un objeto como deshabilitado) y el siguiente (hacer que cada componente se ocupe de los cambios de estado) parece ser la mejor de mis ideas, pero ninguna de ellas me llama especialmente la atención.
¿Alguien más tiene alguna otra idea sobre cómo hacer esto?
editar Mientras hablo de entrada específicamente en esta pregunta, puede significar cualquier sistema capaz de enviar mensajes / eventos a entidades, como colisiones, eventos de temporizador, etc.