Teilen Sie dies in mehrere Ebenen.
Auf der untersten Ebene haben Sie unformatierte Eingabeereignisse vom Betriebssystem. SDL-Tastatureingabe, Mauseingabe, Joystick-Eingabe usw. Möglicherweise gibt es mehrere Plattformen (SDL ist ein Nenner mit den wenigsten Gemeinsamkeiten, dem beispielsweise mehrere Eingabeformulare fehlen, die Sie später interessieren könnten).
Sie können diese mit einem sehr einfachen benutzerdefinierten Ereignistyp wie "Tastatur gedrückt" oder ähnlichem abstrahieren. Wenn Ihre Plattformebene (SDL-Spieleschleife) Eingaben empfängt, sollte sie diese Ereignisse auf niedriger Ebene erstellen und dann an einen Eingabemanager weiterleiten. Dies kann mit einfachen Methodenaufrufen, Rückruffunktionen, einem komplizierten Ereignissystem geschehen, ganz wie Sie möchten.
Das Eingabesystem hat nun die Aufgabe, Eingaben auf niedriger Ebene in logische Ereignisse auf hoher Ebene zu übersetzen. Die Spielelogik kümmert sich überhaupt nicht darum, dass SPACE gedrückt wurde. Es ist wichtig, dass JUMP gedrückt wurde. Die Aufgabe des Eingabe-Managers besteht darin, diese Eingabeereignisse auf niedriger Ebene zu erfassen und Eingabeereignisse auf hoher Ebene zu generieren. Es ist dafür verantwortlich zu wissen, dass sowohl die Leertaste als auch die A-Schaltfläche des Gamepads dem logischen Befehl Jump zugeordnet sind. Es befasst sich mit Gamepad vs Maus-Look-Steuerelementen und so weiter. Es gibt logische Ereignisse auf hoher Ebene aus, die von den Steuerelementen auf niedriger Ebene so abstrakt wie möglich sind (es gibt hier einige Einschränkungen, aber Sie können die Dinge im allgemeinen Fall vollständig abstrahieren).
Ihr Charakter-Controller empfängt dann diese Ereignisse und verarbeitet diese übergeordneten Eingabeereignisse, um tatsächlich zu reagieren. Die Plattformebene hat das Ereignis "Leertaste drücken" gesendet. Das Eingabesystem hat dies empfangen, überprüft seine Zuordnungstabellen / -logik und sendet dann das Ereignis "Gepresster Sprung". Der Spiellogik- / Charakter-Controller empfängt dieses Ereignis, prüft, ob der Spieler tatsächlich springen darf, und gibt dann das Ereignis "Spieler gesprungen" aus (oder veranlasst direkt einen Sprung), mit dem die übrige Spiellogik alles Mögliche ausführt .
Alles, was von der Spielelogik abhängt, geht in den Player-Controller. Alles, was vom Betriebssystem abhängt, liegt in der Plattformebene. Der Rest geht in die Eingabeverwaltungsebene.
Hier sind einige amateurhafte ASCII-Grafiken, um dies zu beschreiben:
-----------------------------------------------------------------------
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
-----------------------------------------------------------------------