Розділіть це на кілька шарів.
На найнижчому шарі у вас є необроблені події введення з ОС. Введення SDL-клавіатури, введення миші, введення джойстика тощо. Можливо, у вас є кілька платформ (SDL - найменш поширений знаменник, якому не вистачає декількох форм введення, наприклад, про які пізніше ви можете піклуватися).
Можна абстрагувати їх за допомогою користувацького типу події дуже низького рівня, наприклад "кнопка клавіатури вниз" тощо. Коли ваш рівень платформи (цикл ігор SDL) отримує вхід, він повинен створити ці події низького рівня і потім переслати їх менеджеру введення. Зробити це можна за допомогою простих методів викликів, функцій зворотного дзвінка, складної системи подій, що завгодно.
Тепер система введення має завдання переводити вхід низького рівня в логічні події високого рівня. Логіку гри зовсім не хвилює те, що натиснули SPACE. Байдуже, що JUMP було натиснуто. Завдання менеджера вводу полягає в зборі цих подій низького рівня та генеруванні подій на високому рівні. Він несе відповідальність за те, що пробіл та кнопка «A» ігрової панелі відображаються в логічній команді «Перейти». Він стосується управління геймпадом проти миші тощо. Він випромінює логічні події високого рівня, які є максимально абстрактними від елементів управління низького рівня (тут є деякі обмеження, але ви можете повністю абстрагувати речі у звичайному випадку).
Потім ваш контролер символів отримує ці події та обробляє ці події високого рівня, щоб реально реагувати. Шар платформи надіслав подію "Клавіша пробілу вниз". Система вводу отримала це, переглядає свої таблиці / логіку відображення, а потім надсилає подію "Натиснутий стрибок". Контролер логіки гри / персонажів отримує цю подію, перевіряє, чи гравцю насправді дозволено стрибати, а потім випромінює подію "Гравець, що стрибнув" (або просто безпосередньо спричиняє стрибок), яку решта логіки гри використовує, щоб робити все, що завгодно .
Все, що залежить від логіки гри, переходить у контролер програвача. Все, що залежить від ОС, перебуває в шарі платформи. Все інше йде у вхідний рівень управління.
Ось кілька аматорських мистецтв 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
-----------------------------------------------------------------------