Sé que esta pregunta se ha hecho varias veces, pero todavía no estoy seguro de cómo implementar el manejo de entrada en un motor basado en componentes.
El diseño basado en componentes que utilicé se basó en la serie de blogs de T = Machine y en Artemis en el que las entidades son solo identificadores.
Hay tres ideas principales que tengo para implementar el manejo de entradas:
- El componente de entrada contendrá eventos que le interesen. El sistema de entrada traducirá los eventos de tecla y mouse a eventos del juego y recorrerá las entidades con el componente de entrada y, si están interesados en el evento, el sistema de entrada tomará las medidas apropiadas. Esta acción estaría codificada en el sistema de entrada.
- Sin componente de entrada. Debería registrar entidades con eventos específicos en el sistema de entrada. El sistema de entrada enviaría mensajes (con la identificación de la entidad y el tipo de evento) a otros sistemas para que estos puedan tomar las medidas apropiadas. O como en el primer caso, las acciones estarían codificadas en el sistema de entrada.
- Similar al primer método, pero en lugar de codificar la acción al sistema de entrada, el componente contendría un mapa de eventos a funciones (es decir
std::map<std::function>
) que sería llamado por el sistema de entrada. Esto tiene el efecto adicional de poder acoplar el mismo evento a diferentes acciones.
¿Recomendaría alguno de los métodos anteriores o tiene alguna sugerencia que me ayude a implementar un sistema de manejo de entrada flexible? Además, todavía no estoy familiarizado con los subprocesos múltiples, pero cualquier sugerencia que haga que la implementación sea amigable con los hilos también es bienvenida.
Nota: Un requisito adicional que me gustaría que cumpliera la implementación es que podría pasar la misma entrada a muchas entidades, como por ejemplo mover una entidad de cámara y el reproductor al mismo tiempo.