Когда заходит речь про контроллер управления - в голове возникает что-то вроде геймпада от PS или XBOX - эдакая панелька с кнопками.
Однако, в контексте игры - это не совсем так. Дело в том, что чисто технически, средством управления может стать что угодно: клавиатура, мышь или же удалённый сервер. По-сути, контроллер - это не какое-то физическое железо (в настоящем контексте), а некоторый программный интерфейс, написанный предельно обобщённо, чтобы его можно было использовать в разных случаях и не привязывать ни к чему.
Подход такой очень прагматичен. Например, мы сделали игру, играть в которую можно с клавиатуры и "завязались" на определённые кнопки. Но тут - игру пытаются запустить с телефона, где всё выполняется жестами. И тут всё, что называется, встаёт колом, т.к. невозможно играть на телефоне через клавиатуру.
Именно поэтому, интерфейс управления - контроллер - выносится в некую отдельную программную сущность, которая позволяет управлять адаптацию к разным способам и стилям управления.
В принципе, любой контроллер пишется исходя из текущих потребностей игры. Где-то хватит одной кнопки, а где-то нет. Однако, есть некоторое количество общих рекомендаций, которые следует использовать для работы с контроллером:
- Считывает нажатия кнопок и преобразует их в понятную структуру.
- Учитывает воздействие окружающей среды (например, замедляет продвижение или ускоряет снижение); это задаётся отдельно. При этом воздействия могут быть как одноразовыми или зависящими от текущих условий (например, штраф), так и постоянными (например, гравитация).
- На основании текущих состояний 1 и 2 - формирует вектор движения.
- Отслеживает цепочки нажатий кнопок для выполнения сложных приёмов (например - комбо или двойной прыжок) и регулирует состояния.
Думаю, можно добавить ещё несколько принципов, но я пока что, пишу про некоторый базовый контроллер, который можно использовать для относительно несложных игр.
Сам по себе контроллер - это не просто некоторое программное управление игровым персонажем - это внутреннее состояние, регламентирующее текущее поведение персонажа на экране. Он ничего не знает ни про особенности отрисовки, ни про то, каково в настоящий момент состояние персонажа (хотя может косвенно и знать: например, в случае получения урона, игровой персонаж получает штраф - его откидывает назад и на время этого "отброса" - он не управляем).
В общем, контроллер сам по себе - довольно неоднозначная штука, хотя на первый взгляд кажется, что всё просто. Пожалуй главным тезисом контроллера - это то, что он хранит состояние управления и даёт игровому персонажу некоторые команды даже тогда, когда ни одна кнопка не нажата.