2012-05-08 3 views
0

현재 게임을 만들기 위해 SDL을 사용 중입니다. SDL이 일부 이벤트를 픽업하지 않는 문제가 있습니다. 예를 들어, 나는 앞으로 나아갈 때 'w'를 누르는 동시에, 마우스를 움직여서 둘러 볼 것입니다. 그러나 'a'또는 'd'를 누르거나 SDL이 이러한 이벤트를 선택하지 않거나 'w'를 릴리스하더라도 SDL은 KEYUP 이벤트를 수신하지 않습니다. Windows에서이 코드를 처음 작성했는데 우분투로 전환 한 후에는 더 이상 제대로 작동하지 않습니다. 이 이벤트에서 코드()입니다SDL_PollEvent가 모든 이벤트를 선택하지 않습니다.

while(Running) 
{ 
    while(SDL_PollEvent(&event)) 
     Events(&event); 
    if(active){ 
     Loop(); 
     Render(); 
    } 
} 

: 나는 이벤트를 폴링 곳 여기 내 주요 루프

switch(Event->type) 
    { 
     case SDL_QUIT: 
      Running = false; 
      break; 
     case SDL_KEYDOWN: 
      switch(Event->key.keysym.sym) 
      { 
       case SDLK_ESCAPE: 
        Running = false; 
        break; 
       case SDLK_a: 
        keyStates['a'] = true; 
        break; 
       case SDLK_s: 
        keyStates['s'] = true; 
        break; 
       case SDLK_d: 
        keyStates['d'] = true; 
        break; 
       case SDLK_w: 
        keyStates['w'] = true; 
        break; 
       case SDLK_LSHIFT: 
        camera.setSpeed(2.0f); 
        break; 
      } 
      break; 
     case SDL_KEYUP: 
      switch(Event->key.keysym.sym) 
      { 
       case SDLK_a: 
        keyStates['a'] = false; 
        break; 
       case SDLK_s: 
        keyStates['s'] = false; 
        break; 
       case SDLK_d: 
        keyStates['d'] = false; 
        break; 
       case SDLK_w: 
        keyStates['w'] = false; 
        break; 
       case SDLK_LSHIFT: 
        camera.setSpeed(1.0f); 
        break; 
      } 
      break; 
     case SDL_MOUSEBUTTONDOWN: 
      switch(Event->button.button) 
      { 
       case SDL_BUTTON_MIDDLE: 
        mouse.middle = true; 
        break; 
      } 
      break; 
     case SDL_MOUSEBUTTONUP: 
      switch(Event->button.button) 
      { 
       case SDL_BUTTON_MIDDLE: 
        mouse.middle = false; 
        break; 
      } 
      break; 
     case SDL_MOUSEMOTION: 
      if(moving){ 
       camera.lookat(float(Event->motion.x - winWidth/2),float(Event->motion.y - winHeight/2), MOUSE_SENSITIVITY, dt); 
       SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); 
       SDL_WarpMouse(winWidth/2, winHeight/2); 
       SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE); 
      } 
      break; 
    } 

답변

1

keyStates [ 'A는'] 진정한 =이;

여기에는 SDL_GetKeyState이 있습니다. 어레이를 수동으로 유지 보수하는 대신 사용하십시오.

Uint8 keys[SDLK_LAST]; 
Uint8* sdlKeys = SDL_GetKeyState(0); 
memcpy(keys, sdlKeys, sizeof(keys)); 

.

bool keyPressed(SDLKey key){ 
    return keys[key] == SDL_PRESSED; 
} 

documentation도 확인하십시오.

+0

-1 : 프론트 페이지에 대한 링크는 OP를 불필요한 정보없이 문제에 대한 답변으로 유도하지 않습니다. 물론 그것은 그들을 읽게하고 결국 답을 얻게됩니다. 그러나 문제를 해결하는 데 도움이되지 않는 수많은 엑스트라가 있습니다. – user2738698

+0

@ user2738698 : 야. 질문과 답의 날짜를 확인하십시오. – SigTerm

+0

그래서? 미래의 사람들도 도움이되지 않습니다. 대답의 대부분은 문제가되지 않습니다. 첫 페이지에 대한 링크는 문제를 해결하고자하는 사람들에게 도움이되지 않습니다. – user2738698

관련 문제