2

我正在尝试在 C++ 中的 SDL 中捕捉 F1 键的事件。但是,不知何故,按下 F1 键后我看不到任何变化。但是,当我想在屏幕上切换我的动画对象时,我使用 SDL_t 案例来执行此操作,并且执行得很好。只是不明白为什么不按 F1 键。下面是处理按键事件的 switch case:

SDL_Event event;

  bool done = false;
  bool keyPress = false;
  while ( not done ) {
    draw();
    SDL_Flip(screen);

    SDL_PollEvent(&event);
    if (event.type ==  SDL_QUIT) { break; }
    if(event.type == SDL_KEYUP) { keyCatch = false; }
    if(event.type == SDL_KEYDOWN) {
      switch ( event.key.keysym.sym ) {
        case SDLK_ESCAPE : done = true; break;
        case SDLK_q      : done = true; break;
        case SDLK_F1     :  {
    if(!keyCatch){
              keyPress=true;
                     //this method is from another class.
                  io.printMessageAt("F1 is selected:",50,10);       
              currentOrb = (currentOrb+1) % orbs.size(); 
                      }
        break; 
        } 
        case SDLK_t : case SDLK_SPACE :
          if ( !keyPress ) {
            //something
          }
          break;
        case SDLK_p      : {
          if (!keyPress) {
            keyPress = true;
            //something
          }
          break;
        }
        default          : break;
      }
    }
  }

注意:我不能在这里给出整个代码。以上是我正在尝试做的部分。

4

1 回答 1

1

仔细检查您的窗口管理器或热键守护程序是否在您的进程命中之前没有消耗您的 F1。

这在我的系统上工作正常(F1 关闭程序):

#include <SDL.h>

int main( int, char** )
{
    SDL_Init(SDL_INIT_EVERYTHING); 
    SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32, SDL_ANYFORMAT);

    SDL_Event event;

    bool done = false;
    bool keyPress = false;
    while ( !done ) 
    {
        SDL_Flip(screen);

        SDL_PollEvent(&event);
        if(event.type == SDL_QUIT) 
        { 
            break; 
        }
        if(event.type == SDL_KEYUP) 
        { 
            keyPress = false; 
        }
        if(event.type == SDL_KEYDOWN)
        {
            switch ( event.key.keysym.sym ) 
            {
            case SDLK_ESCAPE: 
            case SDLK_q: 
                done = true; 
                break;
            case SDLK_F1:  
                if(!keyPress)
                {
                    keyPress=true;
                    done = true;
                }
                break; 
            case SDLK_t:
            case SDLK_SPACE:
                if ( !keyPress ) 
                {
                    //something
                }
                break;
            case SDLK_p: 
                if (!keyPress) 
                {
                    keyPress = true;
                    //something
                }
                break;
            default: 
                break;
            }
        }
    }

    SDL_Quit();
    return 0;
}

我确实注意到这keyCatch是未定义的。我用keyPress.

于 2012-10-18T13:33:50.020 回答