본문 바로가기

Study/Engine

[SDL Tutorial] Lesson 8 - Key Press



 안녕하세요. 오늘은 대부분의 게임에서 빼놓을 수 없는 키보드 이벤트에 대해 다룰 것입니다.


8 - 1 : 키보드 이벤트?

 예전에 4번째 강의에서 이벤트에 대해 배우셨죠? 그때 이벤트에 대한 예제로 나왔던 것이 X버튼을 눌렀을 때 종료하게 만드는 것이었습니다. 그리고 이벤트에 대해 설명했을 때 키보드나 마우스에 대한 것도 언급했었지요.

 예를들면, 캐릭터를 상하좌우로 움직이게 해야하는데, 방향키에 그 역할을 맡아주게 하는 것이지요. 어려분도 아시겠지만 방향키를 누른다고해서 화면에 띄어진 캐릭터가 움직이는 건 아니죠. 방향키를 눌렀을 때 캐릭터를 움직이게 정의를 해줘야 움직이겠지요. 그럴 때 키보드의 눌림 등을 감지해내는데, 이런 것을 키보드 이벤트라 할 수 있습니다.

 이렇게 말로하는 것보단 역시 예제를 통해서 직접 보셔야 이해가 빠르실 듯 합니다. 백문이불여일견이라고도 하잖아요?ㅎㅎ


8 - 2 : 4Arrows



 오늘 만들어볼 예제는 방향키를 누르면 그 방향키에 맞는 방향을 화면에 출력해주는 것을 할 것입니다. Lesson 7의 소스 코드에서 수정하시면 보다 더 편할 것입니다. 완성된 Lesson 8의 소스는 본문 하단에 있습니다.

    // 화면에 출력할 메시지를 생성 
    upMessage = TTF_RenderUTF8_Solid( font, "↑", textColor );
    downMessage = TTF_RenderUTF8_Solid( font, "↓", textColor );
    leftMessage = TTF_RenderUTF8_Solid( font, "←", textColor );
    rightMessage = TTF_RenderUTF8_Solid( font, "→", textColor );

 먼저 방향키를 출력해 줄 4개의 메시지를 생성합니다. 그전에 미리 변수들을 선언해야겠죠?

     // handle에 이벤트가 있다면,
if( SDL_PollEvent( &event ) )
{
if( event.type == SDL_KEYDOWN )
{

 키보드 입력이 있다면 조건문 안으로 들어갈 것입니다. 키보드를 눌렀(down)는지를 확인합니다.

// 눌린 키에 대한 동작을 설정해준다. 
// message 화면에 미리 설정한 메시지를 넣는다.
switch( event.key.keysym.sym )
{
case SDLK_UP: message = upMessage; break;
case SDLK_DOWN: message = downMessage; break;
case SDLK_LEFT: message = leftMessage; break;
case SDLK_RIGHT: message = rightMessage; break;
default: message = TTF_RenderUTF8_Solid( font, "다른 키를 입력하셨습니다.", textColor );
}
}
  // 사용자가 X 버튼을 눌렀다면,
else if( event.type == SDL_QUIT )
{
// 프로그램 종료 (루프 종료)
quit = true;
}
}

 

출처 : Lazy Foo' Productions


 event안에 key라는 SDL_KeyboardEvent 구조체가 있고, key안에 keysym이라는 SDL_keysym이라는 구조체가 있습니다. 그리고 keysym안에는 sym이라는 SDLKey가 있지요. 여기에서 현재 눌린 값이 sym이 되는 것입니다. 우리는 이 프로그램에서 4개의 방향키의 동작만을 원하므로 SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT만을 체크하여 해당 작업을 수행하게 만들었습니다. 이런 키들은 이미 정의가 되어있으므로, SDL 문서에 찾아보시면 나와있을 것입니다. 그리고 X를 누르면 프로그램을 종료하게도 만들어야하므로 저번에 배웠던 것처럼 했습니다.

 간혹, 일부 컴파일러에서 switch문을 default없이 쓰게되면 엄청난량의 경고를 볼 수 있을 겁니다. 그때엔 switch문 끝에  default: ;  를 쓰시는게 좋습니다. 제가 쓰는 이클립스의 경우에도 그런 현상이 벌어져서, default를 사용했지만, 그냥 default만 쓰긴 허전하니까 교육적인 차원에서(?) 다른 키를 누르면 다른 반응이 나오도록 해봤습니다.

// 키보드 입력이 없다면 보여줄 필요 없는 메시지를 걸러낸다
if( message != NULL )
{
// 이미지를 화면에 적용
apply_surface( 0, 0, background, screen );
apply_surface( ( SCREEN_WIDTH - message->w ) / 2, ( SCREEN_HEIGHT - message->h ) / 2, message, screen );

// message를 NULL로 한다 
message = NULL;
}

// 화면 갱신
if( SDL_Flip( screen ) == -1 )
{
return 1;
}

 message에 아무것도 없으면 화면에 출력하지 않도록 하는 코드입니다. 그리고 message->w와 message->h는 현재 message에 있는 화면(여기에서는 폰트)의 크기(width, height)를 알려줍니다. 저렇게 하면 화면 가운데에 출력이 됩니다. 이렇게 하면 예제 프로그램 완료!

 이것으로 이번 강의는 마치도록 하겠습니다. 이번에 했던 예제 프로그램 소스를 받고 싶으시면


 여기에서 받아주시기 바랍니다. 글자 출력 관련은 Lesson 7을 참고하시기 바랍니다. 다음 강의는 마우스 이벤트에 대해 해보겠습니다.


- Lesson 8을 마무리하며...

 게임을 만드는 데에 기본적이고 중요한 요소 중 하나를 오늘 배웠습니다. 모든 게임이 그렇듯이 이러한 기본적인 요소들이 모이고 모여서 이뤄지는 프로그램입니다. 무엇보다도 기본이 중요하다는 것을 잊지 않았으면 좋겠습니다. 여러분께서도, 제 자신에게도 그렇게 말하고 싶네요.