Клавиша SDLK_F1 не работает

Я пытаюсь поймать событие для клавиши F1 в SDL на С++. Но почему-то я не вижу никаких изменений после нажатия клавиши 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;
      }
    }
  }

ПРИМЕЧАНИЕ. Я не могу привести здесь весь код. Вышеизложенное — это моя часть того, что я пытаюсь сделать.


sdl
person pascal    schedule 18.10.2012    source источник
comment
Почему вы захватываете только одно событие в каждом кадре?   -  person genpfault    schedule 18.10.2012


Ответы (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.

person genpfault    schedule 18.10.2012
comment
привет, проблема решена только что с использованием флагов, на самом деле я хотел выполнить какую-то другую функцию, так что просто небольшая проблема, но все равно спасибо. - person pascal; 19.10.2012