SDLK_F1键情况不起作用

时间:2012-10-18 04:48:01

标签: sdl

我试图在C ++中捕获SDL中F1键的事件。 但是,按下F1键后,我无法看到任何变化。但是,当我想在屏幕上切换我的动画对象时,我会使用SDL_t情况来执行此操作,并且执行正常。 只是没有说明为什么它不接受F1键。 以下是处理按键事件的开关案例:

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

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

1 个答案:

答案 0 :(得分: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替换了它。