2014-11-23 4 views
0

키를 누를 때마다 오류가 발생하지 않으며 다소 이상합니다. 여기에, 아니 적어도키보드 입력을 인식하지 못합니다.

void Game::update() 
{ 
    if (p1MoveUp) 
    { 
     std::cout << "asfasfasf" << std::endl; //for debug purposes :) 
     p1YPos -= 5; 
    } 
} 

그리고 마지막으로 : 여기

void Game::handleEvents() 
{ 
    SDL_Event event; 

    switch (SDL_PollEvent(&event)) { 
     case SDL_KEYDOWN: 
      p1MoveUp = true; 
      break; 
     case SDL_KEYUP: 
      p1MoveUp = false; 
      break; 

     default: 
      break; 

    } 
} 

내 업데이트 기능입니다 : 여기
bool Game::init(int resx, int resy, bool fullscreen) 
{ 
    tm = new TextureManager(); 
    int flags = 0; 
    if(fullscreen) 
    { 
     flags = SDL_WINDOW_FULLSCREEN; 
    } 

    if(SDL_Init(SDL_INIT_EVERYTHING) >= 0) 
    { 
     g_pWindow = SDL_CreateWindow("Pong", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, resx, resy, flags); 

     if(g_pWindow != 0) 
     { 
      g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0); 

      if(g_pRenderer != 0) 
      { 
       running = true; 

       tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/bg.png", "bg", g_pRenderer); 
       tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/paddle.png", "player1", g_pRenderer); 
       tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/paddle.png", "player2", g_pRenderer); 
       tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/ball.png", "ball", g_pRenderer); 

       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return false; 
     } 
    } 

    return false; 
} 

내 이벤트 핸들러 : 여기

init 기능입니다 main.cpp (포함 제외 ...)

Game *g_game = 0; 

int main(int argc, const char * argv[]) 
{ 
    g_game = new Game(); 
    g_game->init(800, 600, false); 

    while(g_game->isRunning()) 
    { 
     g_game->handleEvents(); 
     g_game->update(); 
     g_game->render(); 
    } 

    g_game->clean(); 
    SDL_Quit(); 

    return 0; 
} 

답변

2

SDL_PollEvent을 잘못 사용하고 있습니다. 이 함수는 이벤트 유형을 반환하지 않고 이벤트 대기열에 항목이 남아 있으면 1을, 대기열이 비어 있으면 0을 반환합니다.

void Game::handleEvents() 
{ 
    SDL_Event event; 

    // Poll events until the queue is empty... 
    while(SDL_PollEvent(&event)) { 

     // ...then check the event. 
     switch (event.type) { 
      case SDL_KEYDOWN: 
       p1MoveUp = true; 
       break; 
      case SDL_KEYUP: 
       p1MoveUp = false; 
       break; 

      default: 
       break; 
     }  
    } 
} 

편집을 :

그래서 당신은 오래가 큐에 물건이 다음과 같은 event.type를 통해 switch을 같은 이벤트를 폴링 싶어 아래로 그 현재 모든 키를 참고 키보드상의 각 키의 업 이벤트가 발생하면 p1MoveUp 플래그가 전환됩니다. SDL_KEYDOWNSDL_KEYUP 내에서 일반적으로 을 확인하면 키가 눌려져 그에 따라 작동합니다. 다음과 같이 할 수 있습니다.

if(event.key.keysym.sym == SDLK_UP) ... 

"위로 커서"의 키 코드가 눌러 졌는지 확인합니다. 키 스캔 코드키 코드 사이에는 차이가 있습니다. 위와 같이 후자를 확인하는 것이 좋습니다. 이 모든 SDL 정의 키 코드는 여기에서 찾을 수 있습니다 (맨 오른쪽 열을보십시오) : https://wiki.libsdl.org/SDL_Keycode

다른 키와 다른 키 이벤트를 확인하는 경우 이벤트 처리기가 매우 빠르게 커질 수 있으므로주의해야합니다. SDL의 이벤트 메커니즘에 익숙해지면 추가 클래스 또는 다른 캡슐화 방법을 구현할 수 있습니다.

+0

고마워요! 일했다 :) – WilsonKoder111

1

SDL_PollEvent는 true 또는 false를 반환합니다. https://wiki.libsdl.org/SDL_PollEvent

SDL_PollEvent가 true를 반환하면 '이벤트'가 설정됩니다. 그런 다음 event.type을 대신 사용하십시오.

관련 문제