【问题标题】:SDLK_F1 key case not workingSDLK_F1 钥匙盒不工作
【发布时间】:2013-09-30 00:16:10
【问题描述】:

我试图在 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;
      }
    }
  }

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

【问题讨论】:

  • 为什么每帧只抓取一个single事件?

标签: sdl


【解决方案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

【讨论】:

  • 嗨,问题解决了只是使用了标志,实际上我想执行一些其他功能,所以只是一个小问题,但还是谢谢。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2022-01-15
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多