Нашел на форуме пример «нормальной» обработки клавиатурных событий. http://www.gamedev.net/topic/452938-sdl-multiple-key-press-events/
#include <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
SDL_Event event;
SDL_Window *win;
int app_running;
int key[500];
//Прототипы функций
void test_func(void);
void test_func2(void);
void test_func3(void);
void key_press(int key, void (*ptr)(void));
void key_listing(void);
//Листаем события
void key_listing()
{
if (SDL_PollEvent(&event))
{
//Выход по крестику
if (event.type == SDL_QUIT) app_running=0;
//"Нажатие" клавиши
if (event.type == SDL_KEYDOWN) key[event.key.keysym.sym]=1; //Статус "Нажато"
//"Поднятие" клавиши
if (event.type == SDL_KEYUP) key[event.key.keysym.sum]=0; //Статус "НЕ нажато"
}
}
//Передаем в функцию код клавиши (keyi) и адрес на функцию
void key_press(int keyi, void (*ptr)(void))
{
if (key[keyi]) ptr; //Точно не помню, верно ли это, но, если зажатая клавиша имеет состояние 1, то выполняется функция ptr
}
//Тестовые функции, меняем заголовок окна
void test_func()
{
SDL_SetWindowTitle(win, ".");
}
void test_func2()
{
SDL_SetWindowTitle(win, "..");
}
void test_func3()
{
SDL_SetWindowTitle(win, "...");
}
int main(int argc, char **argv)
{
app_running = 1;
win = SDL_CreateWindow("Window",SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 380, 0);
while(__app_running)
{
key_liting();
//Передаем функции "код" клавиши и адрес функции, которую необходимо выполнить
key_press(SDLK_q, &test_func);
key_press(SDLK_w, &test_func2);
key_press(SDLK_e, &test_func3);
}
}
SDLK_F1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1),