Dividi questo in più livelli.
Al livello più basso si hanno eventi di input non elaborati dal sistema operativo. Input da tastiera SDL, input da mouse, input da joystick, ecc. Potresti avere diverse piattaforme (SDL è un minimo comune denominatore privo di diverse forme di input, ad esempio, di cui potresti preoccuparti in seguito).
Puoi astrarli con un tipo di evento personalizzato di livello molto basso, come "pulsante della tastiera in basso" o simili. Quando il livello della piattaforma (loop di gioco SDL) riceve input, dovrebbe creare questi eventi di basso livello e quindi inoltrarli a un gestore input. Può farlo con semplici chiamate di metodo, funzioni di callback, un sistema di eventi complicato, qualunque cosa ti piaccia di più.
Il sistema di input ha ora il compito di tradurre input di basso livello in eventi logici di alto livello. La logica di gioco non si preoccupa affatto che SPACE sia stato premuto. Si preoccupa che JUMP sia stato premuto. Il compito del gestore dell'input è raccogliere questi eventi di input di basso livello e generare eventi di input di alto livello. È responsabile di sapere che la barra spaziatrice e il pulsante del gamepad "A" sono entrambi associati al comando logico Jump. Si occupa di controlli del gamepad vs del mouse e così via. Emette eventi logici di alto livello che sono il più astratti possibile dai controlli di basso livello (ci sono alcune limitazioni qui, ma puoi astrarre completamente le cose nel caso comune).
Il controller del personaggio quindi riceve questi eventi ed elabora questi eventi di input di alto livello per rispondere effettivamente. Il livello della piattaforma ha inviato l'evento "Key down spacebar". Il sistema di input lo ha ricevuto, guarda le sue tabelle / logiche di mappatura e quindi invia l'evento "Pressed jump". La logica di gioco / controller del personaggio riceve quell'evento, verifica che il giocatore sia effettivamente autorizzato a saltare e quindi emette l'evento "Player jumped" (o fa semplicemente accadere direttamente un salto), che il resto della logica di gioco usa per fare qualunque cosa .
Tutto ciò che dipende dalla logica del gioco va nel controller del giocatore. Tutto ciò che dipende dal sistema operativo va a livello di piattaforma. Tutto il resto va nel livello di gestione dell'input.
Ecco alcune opere amatoriali ASCII per descriverlo:
-----------------------------------------------------------------------
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
-----------------------------------------------------------------------