Разделите это на несколько слоев.
На самом нижнем уровне у вас есть необработанные входные события из ОС. Ввод с клавиатуры SDL, ввод с помощью мыши, ввод с помощью джойстика и т. Д. У вас может быть несколько платформ (SDL - это наименьший общий знаменатель, которому не хватает, например, нескольких форм ввода, о которых вам может потребоваться позднее).
Вы можете абстрагировать их с помощью пользовательского типа события очень низкого уровня, такого как «кнопка клавиатуры вниз» или тому подобное. Когда уровень вашей платформы (игровой цикл SDL) получает входные данные, он должен создать эти низкоуровневые события и затем направить их в менеджер ввода. Это можно сделать с помощью простых вызовов методов, функций обратного вызова, сложной системы событий, что бы вы ни хотели.
Система ввода теперь имеет функцию преобразования низкоуровневого ввода в логические события высокого уровня. Игровая логика совершенно не заботится о том, чтобы пробел был нажат. Это волнует, что JUMP был нажат. Задача менеджера ввода состоит в том, чтобы собирать эти входные события низкого уровня и генерировать входные события высокого уровня. Он отвечает за знание того, что пробел и кнопка геймпада «А» соответствуют логической команде «Перейти». Он имеет дело с геймпадом, мышью и другими элементами управления. Он генерирует высокоуровневые логические события, которые настолько абстрагированы, насколько это возможно, от низкоуровневых элементов управления (здесь есть некоторые ограничения, но вы можете полностью абстрагироваться в общем случае).
Ваш контроллер персонажа затем получает эти события и обрабатывает эти высокоуровневые входные события для фактического ответа. На уровне платформы отправлено событие «Клавиша пробела». Система ввода получает это, просматривает свои таблицы / логику сопоставления и затем отправляет событие «Нажатый переход». Контроллер игровой логики / персонажа получает это событие, проверяет, действительно ли игроку разрешено прыгать, а затем испускает событие «Прыжок игрока» (или просто вызывает прыжок), которое остальная игровая логика использует для выполнения любых действий. ,
Все, что зависит от игровой логики, попадает в контроллер игрока. Все, что зависит от ОС, идет на уровне платформы. Все остальное переходит на уровень управления вводом.
Вот немного любительского искусства ASCII, чтобы описать это:
-----------------------------------------------------------------------
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
-----------------------------------------------------------------------