2

C++ の SDL で F1 キーのイベントをキャッチしようとしています。しかし、どういうわけか、F1 キーを押した後に変更が表示されません。しかし、画面上のアニメーション オブジェクトを切り替えたい場合は、SDL_t ケースを使用して実行すると、正常に実行されます。F1キーを取らない理由がわからないだけです。キー プレス イベントを処理するための switch ケースを次に示します。

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 に答える