창까지 띄웠으면, 이제 키보드 입력을 받아보자
먼저 SDL 의 이벤트 시스템에 대해서 간단히 알아보자
이벤트 풀
기본적으로 SDL 에서는 이벤트가 발생하면 이벤트를 이벤트 풀이라는곳에 다 담아둔다
이벤트 풀이 담겨있는 이벤트는 SDL_PollEvent 함수를 통해서 불러올 수 있다.
이렇게 불러온 이벤트는 불러온 이벤트 타입에 따라서 다양하게 처리 할 수있다.
다양한 이벤트 타입들은 아래의 링크에서 확인가능하다.
그럼 이벤트 타입에 따라서 어떻게 이벤트를 처리할까
바로 저번에 봤던 코드가 이것이다.
bool quit = false;
SDL_Event event;
while(!quit){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
quit = true;
break;
}
}
SDL_Delay(1);
}
C
복사
SDL_QUIT 는 종료 요청이 들어온경우, 발생되는 이벤트이다.
따라서 SDL_PollEvent(&event) 으로 이벤트 풀에 있는 이벤트를 계속 가져오고
그중에서 event.type 이 SDL_QUIT 인게 있으면,
quit 변수를 바꾸는 방식으로 while 문을 탈출 할 수 있게 한것이다.
위와 같은 방식으로 type 에 따라서 이벤트를 다양하게 처리할 수 있다.
키 입력
다양한 이벤트 중에서도 키보드 이벤트에 대해서 좀더 알아보자
키보드 입력에서는 2가지만 알면 사실상 끝이다.
키가 눌리는중인지, 때지는 중인지
키보드 이벤트에는 KEY_DOWN 과 KEY_UP 타입이 존재한다.
두 타입은 각각 키가 눌릴때와 키가 때질때 발생되는 이벤트이다.
위에서 봤듯이 event.type 을 통해서 각각 처리 할 수 있다.
bool quit = false;
SDL_Event event;
while(!quit){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
quit = true;
break;
case SDL_KEYDOWN:
printf("키가 눌렸어요!\n");
break;
case SDL_KEYUP:
printf("키가 때졌어요!\n");
break;
}
}
SDL_Delay(1);
}
C
복사
무슨 키가 눌렸는지
키보드 이벤트에는 keysym 이라는 타입이 존재하는데,
바로 여기서 무슨 키가 눌린건지/때진건지 확인 할 수 있다.
SDL_Keysym 구조체
keysym 중에서도 sym 에서 가장 키코드값을 확인 할 수있다.
또한 mod 에서는 컨트롤,알트,쉬프트 등이 눌려져있는지 확인 할 수있다.
bool quit = false;
SDL_Event event;
while(!quit){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
quit = true;
break;
case SDL_KEYDOWN:
printf("%d 키가 눌렸어요!\n", event.key.keysym.sym);
break;
case SDL_KEYUP:
printf("%d 키가 때졌어요!\n", event.key.keysym.sym);
break;
}
}
SDL_Delay(1);
}
C
복사
최종 코드
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <SDL2/SDL.h>
SDL_Window *window;
SDL_Renderer *renderer;
// Window dimensions
static const int width = 800;
static const int height = 600;
static int initAll()
{
if (SDL_Init(SDL_INIT_EVENTS) != 0)
{
fprintf(stderr, "%s\n", (SDL_GetError()));
return (0);
}
// Create an SDL window
window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL);
if (window == 0)
{
fprintf(stderr, "%s\n", (SDL_GetError()));
return (0);
}
// Create a renderer (accelerated and in sync with the display refresh rate)
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == 0)
{
fprintf(stderr, "%s\n", (SDL_GetError()));
return (0);
}
return (1);
}
static void closeAll()
{
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
int main()
{
initAll();
bool quit = false;
SDL_Event event;
while(!quit){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
quit = true;
break;
case SDL_KEYDOWN:
printf("%d press!\n", event.key.keysym.sym);
break;
case SDL_KEYUP:
printf("%d release!\n", event.key.keysym.sym);
break;
}
}
SDL_Delay(1);
}
closeAll();
return (0);
}
C
복사