Search
Duplicate
🍏

SDL 2.0 을 알아보자 (3탄) - 키보드 입력 받기

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Graphics
Scrap
태그
9 more properties
창까지 띄웠으면, 이제 키보드 입력을 받아보자
먼저 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.typeSDL_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
복사

Reference