Divide esto en varias capas.
En la capa más baja tiene eventos de entrada sin procesar del sistema operativo. Entrada de teclado SDL, entrada de mouse, entrada de joystick, etc. Es posible que tenga varias plataformas (SDL es un denominador menos común que carece de varias formas de entrada, por ejemplo, que más tarde podría interesarle).
Puede abstraerlos con un tipo de evento personalizado de muy bajo nivel, como "botón de teclado abajo" o similar. Cuando su capa de plataforma (bucle de juego SDL) recibe información, debe crear estos eventos de bajo nivel y luego reenviarlos a un administrador de entrada. Puede hacer esto con llamadas a métodos simples, funciones de devolución de llamada, un sistema de eventos complicado, lo que más le guste.
El sistema de entrada ahora tiene el trabajo de traducir la entrada de bajo nivel en eventos lógicos de alto nivel. La lógica del juego no importa en absoluto que se haya presionado el ESPACIO. Le importa que se haya presionado JUMP. El trabajo del administrador de entrada es recopilar estos eventos de entrada de bajo nivel y generar eventos de entrada de alto nivel. Es responsable de saber que la barra espaciadora y el botón 'A' del gamepad se asignan al comando lógico Jump. Se trata de controles de aspecto de gamepad vs mouse, etc. Emite eventos lógicos de alto nivel que son lo más abstractos posible de los controles de bajo nivel (aquí hay algunas limitaciones, pero puede abstraer las cosas por completo en el caso común).
Su controlador de personaje luego recibe estos eventos y procesa estos eventos de entrada de alto nivel para responder realmente. La capa de plataforma envió el evento "Tecla abajo de la barra espaciadora". El sistema de entrada lo recibió, mira sus tablas / lógica de mapeo y luego envía el evento "Salto presionado". El controlador de lógica / personaje del juego recibe ese evento, verifica que el jugador realmente pueda saltar y luego emite el evento "El jugador saltó" (o simplemente provoca que ocurra un salto), que el resto de la lógica del juego usa para hacer lo que sea .
Todo lo que dependa de la lógica del juego va al controlador del jugador. Todo lo que depende del sistema operativo va en la capa de plataforma. Todo lo demás va a la capa de gestión de entrada.
Aquí hay un poco de arte amateur ASCII para describir esto:
-----------------------------------------------------------------------
Platform Abstraction | Collect and forward OS input events
-----------------------------------------------------------------------
| |
| |
\ /
\_/
-----------------------------------------------------------------------
Input Manager | Translate OS input events into logical events
-----------------------------------------------------------------------
| |
| |
\ /
\_/
-----------------------------------------------------------------------
Character Controller | React to logical events and affect game play
-----------------------------------------------------------------------
| |
| |
\ /
\_/
-----------------------------------------------------------------------
Game Logic | React to player actions and provides feedback
-----------------------------------------------------------------------