Divisez cela en plusieurs couches.
Au niveau le plus bas, vous avez des événements d'entrée bruts du système d'exploitation. Entrée de clavier SDL, entrée de souris, entrée de joystick, etc. Vous pouvez avoir plusieurs plates-formes (SDL est un dénominateur le moins commun sans plusieurs formes d'entrée, par exemple, dont vous pourriez vous soucier plus tard).
Vous pouvez les résumer avec un type d'événement personnalisé de très bas niveau, comme "bouton du clavier enfoncé" ou similaire. Lorsque votre couche de plateforme (boucle de jeu SDL) reçoit des entrées, elle doit créer ces événements de bas niveau, puis les transmettre à un gestionnaire d'entrées. Il peut le faire avec des appels de méthode simples, des fonctions de rappel, un système d'événements compliqué, tout ce que vous préférez.
Le système d'entrée a désormais pour tâche de traduire les entrées de bas niveau en événements logiques de haut niveau. La logique du jeu ne se soucie pas du tout de la pression sur SPACE. Il importe que JUMP ait été pressé. Le travail du gestionnaire d'entrées consiste à collecter ces événements d'entrée de bas niveau et à générer des événements d'entrée de haut niveau. Il est responsable de savoir que la barre d'espace et le bouton de la manette de jeu «A» correspondent tous deux à la commande logique Jump. Il traite des commandes de look gamepad vs mouse et ainsi de suite. Il émet des événements logiques de haut niveau qui sont aussi abstraits que possible des contrôles de bas niveau (il y a quelques limitations ici, mais vous pouvez complètement supprimer les choses dans le cas commun).
Votre contrôleur de personnage reçoit ensuite ces événements et traite ces événements d'entrée de haut niveau pour répondre réellement. La couche de plate-forme a envoyé l'événement "Barre d'espace enfoncée". Le système d'entrée a reçu cela, examine ses tables / logiques de mappage, puis envoie l'événement "Saut pressé". La logique de jeu / contrôleur de personnage reçoit cet événement, vérifie que le joueur est réellement autorisé à sauter, puis émet l'événement "Player jumped" (ou provoque directement un saut), que le reste de la logique de jeu utilise pour faire tout .
Tout ce qui dépend de la logique du jeu va dans le contrôleur du joueur. Tout ce qui dépend du système d'exploitation va dans la couche plate-forme. Tout le reste va dans la couche de gestion des entrées.
Voici un art ASCII amateur pour décrire cela:
-----------------------------------------------------------------------
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
-----------------------------------------------------------------------