Skip to content
BanyRule edited this page Dec 29, 2016 · 1 revision

#Роль Этот модуль отвечает за обработку пользовательского ввода: действия с окном, клавиатура, мышь, джойстики. ##Структуры ####Массив состояний клавиш 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);
}
...
Clone this wiki locally