-
Notifications
You must be signed in to change notification settings - Fork 1
Input
#Роль
Этот модуль отвечает за обработку пользовательского ввода: действия с окном, клавиатура, мышь, джойстики.
##Структуры
####Массив состояний клавиш
static bool keysHeld[MAX_KEYS]
хранит состояния всех клавиш в виде true(нажата) / false (нет)
.
##Методы
####Обработчик нажатия клавиши
void handle_keydown(int keycode)
устанавливает флаг нажатия на указанную клавишу.
####Обработчик отпускания клавиши
void handle_keyup(int keycode)
убирает флаг нажатия на указанную клавишу.
####Проверка состояния клавишы
bool key_held(int keycode)
возвращает true
, если клавиша нажата, иначе false
.
##Как это работает?
В main_loop()
вызывается process_events()
. В этом блоке обрабатываются все SDL события. События SDL_KEYDOWN
и SDL_KEYUP
перехватываются соответственно обработчиками handle_keydown()
и handle_keyup()
. Эти обработчики устанавливают/убирают флаги нажатия клавиши. Таким образом, если нам нужно узнать, нажата ли в данный момент определенная клавиша, то нам достаточно вызвать key_held(SDLK_*)
и проверить возвращаемое значение.
##Простой пример работы с input.h Например, мы хотим перемещать модель нашего игрока по экрану стрелками. Для этого мы должны добавить метод, обновляющий состояние игрока в зависимости от нажатых клавиш:
/* player.c */
#include "player.h"
#include "input.h"
...
void update_player(Player *player)
{
if (key_held(SDLK_LEFT))
{
--player->pos.x;
}
if (key_held(SDLK_RIGHT))
{
++player->pos.x;
}
}
Этот метод можно поместить блок internal_tick()
файла main.c
. Тогда состояние игрока будет обновляться каждый кадр:
/* main.c */
...
static void internal_tick(void)
{
update_player(&player);
}
...