2014-11-23 160 views
0

只要按下按键什么都没有发生,也没有任何错误,这很奇怪。无法识别键盘输入

这里是init功能:

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; 
} 

这里是我的事件处理程序:

void Game::handleEvents() 
{ 
    SDL_Event event; 

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

     default: 
      break; 

    } 
} 

这里是我的更新功能:

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

以及最后但并非最不重要的,在这里是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

所以,你会想,只要有东西在队列中,然后做一个switchevent.type这样轮询事件:

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; 
     }  
    } 
} 

编辑:需要注意的是目前所有关键下来,键盘上每个键的启动事件都会导致p1MoveUp标志切换。在您的SDL_KEYDOWNSDL_KEYUP中,您通常还会检查哪些键已被按下并相应地执行操作。你可以这样做:

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

这将检查“向上游标”的键代码是否被按下。 关键扫描码关键码之间存在差异,为此,我建议您检查后者,如上所示。您可以在这里找到所有这些SDL定义的键码(请看最右边一列):https://wiki.libsdl.org/SDL_Keycode

请注意,如果您正在检查不同的键和不同的键事件,则事件处理程序可以快速增长,所以我建议一旦您熟悉SDL的事件机制,就可以实现额外的类或其他封装方法。

+0

谢谢!工作:) – WilsonKoder111 2014-11-23 09:12:29