본문 바로가기

Study/Engine

[SDL Tutorial] Lesson 10 - Key State



 안녕하신가요? 정말 오랜만에 강의 포스팅을 하는군요. 뭔가 이렇게 띄엄띄엄하다보니 어떤식으로 진행했는지나 기타 등등이 잘 기억이 안나네요 ㅎㅎ; 저 자신도 초보인데 누굴 가르친다고 생각하니 좀 우쭐해있지 않았나 하고 생각이 들기도 합니다. 어쨌든, 오늘은 키보드 버튼의 상태를 다루는 다른 방법에 대해 다뤄보겠습니다. 이벤트를 사용하지 않고 키보드 상태를 처리하는 법입니다.


10 - 1 : Key States

 Lesson 8에서 우리는 이미 이벤트를 이용해서 키보드를 다루는 법을 배웠습니다. 그런데 간단하게 키보드의 눌린 상태를 알 수 있는 함수가 있습니다. 바로 SDL_GetKeyState 라는 함수인데, 아래 예제에서 다루겠지만 각 버튼이 현재 눌렸는지 안눌리고 있는지를 검사해주는 함수입니다. 키에 대한 간단한 작업을 할 때 적절한 함수라 볼 수 있지요.


10 - 2 : 위, 아래, 왼쪽, 오른쪽



 아... 저의 하찮은 네이밍 센스를 이해해주시길 ㅠㅠ... 더이상 좋은 제목이 떠오르지 않더군요. 창의력의 문제랄까요 하하; 주요 부분의 소스를 보며 이해를 해보도록 합시다.

    // 사용자가 종료하지 않을 동안 도는 루프
    while( quit == false )
    {
     // handle에 이벤트가 있다면,
while( SDL_PollEvent( &event ) )
{
  // 사용자가 X 버튼을 눌렀다면,
if( event.type == SDL_QUIT )
{
// 프로그램 종료 (루프 종료)
quit = true;
}
}

 이전 강의에서 키보드 이벤트를 처리하던 구역입니다. 이번엔 종료시의 이벤트만 설정해두고 넘어가지요.

   // 키 값을 얻는다
Uint8 *keystates = SDL_GetKeyState( NULL );

 먼저 SDL_GetKeyState 에 대한 설명을 하겠습니다. SDL_GetKeyState 는 키의 상태를 배열로 반환해주는 함수입니다. 아래 그림이 적절한 예를 보여주고 있습니다.

출처 : Lazy Foo' Productions



 위의 그림을 보시면 알겠지만, 여러 키가 동시에 눌려도 다 감지하는 것을 알 수 있습니다. SDL_GetKeyState 의 인자 값은 NULL로 해놓습니다.

// 만약 ↑ 가 눌렸을 때
if(keystates[ SDLK_UP ])
{
apply_surface( ( SCREEN_WIDTH - up->w ) / 2, ( SCREEN_HEIGHT / 2 - up->h ) / 2, up, screen );
}

// 만약 ↓ 가 눌렸을 때
if( keystates[ SDLK_DOWN ] )
{
apply_surface( ( SCREEN_WIDTH - down->w ) / 2, ( SCREEN_HEIGHT / 2 - down->h ) / 2 + ( SCREEN_HEIGHT / 2 ), down, screen );
}

// 만약 ← 가 눌렸을 때
if( keystates[ SDLK_LEFT ] )
{
apply_surface( ( SCREEN_WIDTH / 2 - left->w ) / 2, ( SCREEN_HEIGHT - left->h ) / 2, left, screen );
}

// 만약 → 가 눌렸을 때
if( keystates[ SDLK_RIGHT ] )
{
apply_surface( ( SCREEN_WIDTH / 2 - right->w ) / 2 + ( SCREEN_WIDTH / 2 ), ( SCREEN_HEIGHT - right->h ) / 2, right, screen );
}

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

 방향키 4개에 대한 기능을 위의 코드처럼 설정해놓을 수 있습니다. 각 방향키가 눌렸을 때 화면에 표시되겠지요. 하지만 일부 키보드에서는 방향키 4개가 전부 눌리지 않거나 일부 키가 동시에 눌리지 않는 경우가 있습니다. 이 점 숙지해주시기 바랍니다. 예제를 만든 이 넷북에서도 최대 3개만 인식했습니다.

 SDL_GetKeyState 외에도 마우스나 조이스틱 등을 다루는 함수가 있습니다. 이 함수들에 대해서는 SDL 문서를 참고해보시기 바랍니다. 이것으로 이번 강의를 마쳐봅니다. 오늘 했던 예제는 아래 링크에서 받으시기 바랍니다.


 다음 강의는 소리 재생에 대해 다뤄보겠습니다.


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

 제가 이틀 후의 발표 결과에 따라 한 달 후에 군대에 갈지도 모릅니다 ㅎㅎ; 군대에서도 강의 포스팅을 할 수 있을진 모르겠지만, 할 수 있었으면 정말 좋겠군요 ^^ 오늘 배운 것으로 간단한 키보드 입력이 가능해졌으니, 여러모로 쓸 곳이 많아지실 듯 싶네요.

'Study > Engine' 카테고리의 다른 글

jMonkeyEngine + ∂  (0) 2011.11.06
OpenGL 튜토리얼 사이트  (2) 2011.05.08
[SDL Tutorial] Lesson 9 - 마우스 이벤트  (2) 2010.01.29
[SDL Tutorial] Lesson 8 - Key Press  (4) 2010.01.07
[SDL Tutorial] Lesson 7 - 글꼴  (4) 2010.01.04