2014-03-01 57 views
0

嘿所以我正在開發一個項目/ 2D遊戲,並且我有一些SDL的奇怪行爲,我敢肯定這可能是我不瞭解的東西。 ProcessKeys函數被調用,除了SDLK_SPACE之外,所有的關鍵壓力都可以正常工作,而且我無法理解爲什麼。SDL 2未檢測到空間keydown,但空間上鍵盤正常工作

更奇怪的是,SDLK_SPACE的SDL_KEYUP開關工作得很好。我試着用一些調試代碼來打印出哪個鍵被按下,當你按下空格鍵時什麼也沒有註冊。鍵盤上的每個其他鍵都在SDL_KEYDOWN案例頂部的調試語句中註冊。

如果任何人都可以看到發生了什麼,我會非常感激。

如果你需要看看它的名字讓我知道。

SDLKeyboard::KeyState SDLKeyboard::ProcessKeys(SDL_Event * event) 
{ 
switch(event->type) 
{ 
    /* Look for a keypress */ 
    case SDL_KEYDOWN: 
    { 
     std::cout << "Key currently pressed" << event->key.keysym.sym << std::endl; 
     /* Check the SDLKey values and move change the coords */ 
      switch(event->key.keysym.sym) 
      { 
       case SDLK_LEFT: 
       { // rotate the ship left 
        c.setIsTurningLeft(true); 
        return this->keystate = LeftPressed; 
        // add code when user presses left 
        break; 
       } 
       case SDLK_RIGHT: 
       { 
       // rotate the ship right 
        c.setIsTurningRight(true); 
        return this->keystate = RightPressed; 
        // add code when user presses right 
        break; 
       } 
       case SDLK_UP: 
       {  
        // accleration 
        c.setIsAccelerating(true); 
        return this->keystate = UpPressed; 
        // add code when user presses up 
        break; 
       } 
       case SDLK_SPACE: 
       {  
        // shoot 
        c.setIsShooting(true); 
        std::cout << "keystate = " << this->keystate; 
        return this->keystate = SpacePressed; 
        // add code when user presses space 
        break; 
       } 
       default: 
       { 
        return this->keystate = NotPressed; 
        break; 
       } 
      } 
     break; 
    } 
    /* We must also use the SDL_KEYUP events to zero the x */ 
    /* and y velocity variables. But we must also be  */ 
    /* careful not to zero the velocities when we shouldn't*/ 
    case SDL_KEYUP: 
    { 
     std::cout << "Key currently pressed" << event->key.keysym.sym << std::endl; 
     switch(event->key.keysym.sym) 
     { 
      case SDLK_LEFT: 
      { /* We check to make sure the ship is moving */ 
       /* to the left. If it is then we zero the */ 
       /* velocity. If the ship is moving to the */ 
       /* right then the right key is still press */ 
       /* so we don't touch the velocity   */ 
       c.setIsTurningLeft(false); 
       return this->keystate = LeftReleased; 
       // code to do things when left isn't pushed anymore but still moving left 
       break; 
      } 
      case SDLK_RIGHT: 
      { // code to do things when right isn't pushed anymore but still moving right 
       c.setIsTurningRight(false); 
       return this->keystate = RightReleased; 
       break; 
      } 
      case SDLK_UP: 
      { // code to do things when up isn't pushed anymore but still moving up 
       c.setIsAccelerating(false); 
       return this->keystate = UpReleased; 
       break; 
      } 
      case SDLK_SPACE: 
      { // accleration 
       c.setIsShooting(false); 
       return this->keystate = SpaceReleased; 
       // add code when user presses up 
       break; 
      } 
      default: 
       break; 
     } 
     break; 
    } 
    default: 
    { 
     return this->keystate = NotPressed; 
     break; 
    } 
} 
} 

編輯:

這裏是所請求的例子。我注意到的另一件事是響應的延遲並不是那麼好。如果您有時按下某個鍵,則控制檯不會打印相應的鍵。可能與我在空間上遇到的問題有關。

void GUI::TakeInput(SDL_Event *e) 
{ 
    while (SDL_PollEvent(e)) 
     OnEvent(e); 
} 
void SDLEvent::OnEvent(SDL_Event * event) 
{ 
    switch(event->type) 
    { 
     case SDL_KEYDOWN: 
     { 
      OnKeyDown(event->key.keysym.sym); 
      break; 
     } 

     case SDL_KEYUP: 
     { 
      OnKeyUp(event->key.keysym.sym); 
      break; 
     } 

     case SDL_MOUSEMOTION: 
     { 
      OnMouseMove(event->motion.x,event->motion.y); 
      break; 
     } 

     case SDL_MOUSEBUTTONDOWN: 
     { 
      OnMouseButtonDown(event->button.button, event->button.x,event->button.y); 
      break; 
     } 

     case SDL_MOUSEBUTTONUP: 
     { 
      OnMouseButtonUp(event->button.button, event->button.x,event->button.y); 
      break; 
     } 

     case SDL_QUIT: { 
      OnExit(); 
      break; 
     } 

     case SDL_SYSWMEVENT: { 
      //Ignore 
      break; 
     } 

     case SDL_WINDOWEVENT_RESIZED: { 
      OnResize(); 
      break; 
     } 

     case SDL_WINDOWEVENT_EXPOSED: { 
      OnExpose(); 
      break; 
     } 

     default: { 
      OnUser(event->user.type,event->user.code,event->user.data1,event->user.data2); 
      break; 
     } 
    } 
} 

void GUI::Play() 
{ 
    Uint32 start_ticks = SDL_GetTicks(); 
    TakeInput(this->setup->GetEvent()); 
    this->keyboard->ProcessKeys(this->setup->GetEvent()); 
    this->setup->RenderBegin(); 
    this->ship->drawBackBuffer(); 
    this->ship->renderSprite(); 
    Uint32 end_ticks = SDL_GetTicks(); 
    int sleep_delay = (1000/60) - (end_ticks-start_ticks); 

    if (sleep_delay > 0) { 
     SDL_Delay(sleep_delay); 
    }  
} 
+0

你打電話給sdl輪詢事件? – this

+0

在我調用這個函數之前,SDL_PollEvent有一個while循環。 – xe0

+0

這不是很有幫助。生成一個最小的測試例子會很好。 – this

回答

0

如果你只在控制檯上event->key.keysym.sym,你應該知道,空格鍵,產生幾乎不可見字符。

試試這個:

std::cout << "<" << event->key.keysym.sym << ">" 

所以你可以看到尖括號之間的印刷whataver可見字符。