2012-12-31 2 views
0

C에서 SDL을 사용하고 있으며 키를 누를 때 화면에서 문자 이동을 시도하고 키를 놓을 때 중지하려고 시도하지만 KEYUP 이벤트가 키가 여전히 눌러져있을 때 트리거되는 경우. pressed()에서 KEYUP 섹션을 제거하면 문자가 화면을 가로 질러 슬라이드되지만 분명히 독자적으로 멈추지는 않습니다. KEYUP 섹션을 안으로두면 키를 반복해서 눌러 화면을 가로 질러 이동해야합니다. 내가 뭘 잘못하고 있는지 알 겠어?C SDL 키보드 이벤트 SDL_KEYUP 키가 눌릴 때 트리거

여기에 내가 가진 무엇 :

... 

int done = 0; 
while (done==0) 
{ 
    pressed(); 
    if (kenter == 1) 
    { 
     state = 1; 
     subscreen(); 
    } 
    if (kescape == 1) 
    { 
     done = 1; 
    } 
    if (kup == 1) 
    { 
     playery += -2; 
    } 
    if (kdown == 1) 
    { 
     playery += 2; 
    } 

    if (kright == 1) 
    { 
     playerx += 2; 
    } 
    if (kleft == 1) 
    { 
     playerx += - 2; 
    } 

... 

int pressed() 
{ 

SDL_Event keyevent; 

while (SDL_PollEvent(&keyevent)) 
{ 
    switch(keyevent.type) 
    { 
     case SDL_KEYDOWN: 
     switch(keyevent.key.keysym.sym) 
     { 
      case SDLK_RETURN: 
      { 
       kenter = 1; 
       break; 
      } 
      case SDLK_ESCAPE: 
      { 
       kescape = 1; 
       break; 
      } 
      case SDLK_a: 
      { 
       ka = 1; 
       break; 
      } 
      case SDLK_s: 
      { 
       ks = 1; 
       break; 
      } 
      case SDLK_UP: 
      { 
       kup = 1; 
       break; 
      } 
      case SDLK_DOWN: 
      { 
       kdown = 1; 
       break; 
      } 
      case SDLK_RIGHT: 
      { 
       kright = 1; 
       break; 
      } 
      case SDLK_LEFT: 
      { 
       kleft = 1; 
       break; 
      } 
      default: 
      break; 
     } 
    } 
    switch(keyevent.type) 
    { 
     case SDL_KEYUP: 
     switch(keyevent.key.keysym.sym) 
     { 
      case SDLK_RETURN: 
      { 
       kenter = 0; 
       break; 
      } 
      case SDLK_ESCAPE: 
      { 
       kescape = 0; 
       break; 
      } 
      case SDLK_a: 
      { 
       ka = 0; 
       break; 
      } 
      case SDLK_s: 
      { 
       ks = 0; 
       break; 
      } 
      case SDLK_UP: 
      { 
       kup = 0; 
       break; 
      } 
      case SDLK_DOWN: 
      { 
       kdown = 0; 
       break; 
      } 
      case SDLK_RIGHT: 
      { 
       kright = 0; 
       break; 
      } 
      case SDLK_LEFT: 
      { 
       kleft = 0; 
       break; 
      } 
      default: 
      break; 
     } 
    } 
} 
return 0; 
} 
+0

switch 문의 여분의 중괄호는 드문 경우이며 코드를 읽는 것이 더 어려워집니다. –

답변

1

이 개 switch 문장의 사용은 홀수와 혼란, 당신은 아마 그 문제를 해결해야한다.

표시되는 문제는 키보드 반복 때문일 수 있습니다. SDL_EnableKeyRepeat() 호출 방법을 참조하십시오.

+0

죄송합니다. 왜 거기에 넣을지 잘 모르겠습니다 ... 키보드 반복 기능이 기본적으로 활성화되어 있습니까? 나는 키보드 반복을 전혀 건드리지 않았다. 지연 매개 변수를 0으로 설정하여 설명서를 사용하지 않도록 설정했지만 이제는 동일한 문제가 발생합니다. –

2

스위치 문이 고장 났다고 생각합니다.

사용이 덜 혼란 방법

int pressed() 
{ 

    SDL_Event event; 

    while(SDL_PollEvent(&event)) 
    { 
     if(event.type == SDLK_KEYDOWN) 
     { 
       switch(event.key.keysym.sym) 
       { 
        case SDLK_RETURN: 
         doStuff = 1 
         break; 
        default: 
         break; 
       } 
     } 
     if(event.type == SDLK_KEYUP) 
     { 
       switch(event.key.keysym.sym) 
       { 
        case SDLK_RETURN: 
         doStuff = 0; 
         break; 
        default: 
         break; 
       } 
     } 
    } 
} 

또한 중요 :

http://content.gpwiki.org/index.php/SDL:Tutorials:Practical_Keyboard_Input

아, 그리고 전역 변수를 사용하지 마십시오!

+0

감사! 나는 당신이 나에게 보여 줬던 것처럼 보이기 위해 나의 switch 성명을 교환했다. 그러나 나는 아직도 같은 문제를 경험하고있다. 키가 해제되지 않은 경우에도 변수가 계속 0으로 설정되는 이유를 파악할 수 없습니다. 전역 변수가 잘못 되었습니까? 여러 변수를 함수에서 다른 변수로 가져 오는 다른 방법이 있습니까? –

+0

원한다면 전체 프로젝트를 보여줄 수 있고 실수를 찾으려고 노력할 것입니다. 저는 현재 SDL과 함께 일하고 있습니다. –