Обработка ключевых событий в SDL и C ++ - PullRequest
3 голосов
/ 04 октября 2011

Я в процессе миграции программы с GLUT на SDL.В моей текущей программе нажатие клавиши a приводит к другому ответу, чем нажатие клавиши A.Это было довольно просто сделать в GLUT, так как обратный вызов функции клавиатуры передавал значение ASCII нажатой клавиши.

void keyPressedFn(unsigned char key, int x, int y){
    switch(key){
    case 'a':
    // do work for a
    break;
    case 'A':
    // do work for A
    break;
    }
}

Я изо всех сил пытаюсь воспроизвести аналогичную функциональность в SDL, поскольку нажатие клавиши a дает одинаковый ответ независимо от того, нажаты ли также клавиши SHIFT или CAPS LOCK.

Есть липростой способ репликации вышеуказанной функции в SDL?

Редактировать : В приведенном выше примере я покажу, как обрабатывать только одну клавишу, однако на практике у меня будет списококоло 15 клавиш, на которые я хочу реагировать по-разному, если нажать и клавишу Shift.

Ответы [ 3 ]

6 голосов
/ 04 октября 2011

Проверьте модификаторы клавиатуры, которые присутствуют при получении события нажатия клавиши.Например:

while(SDL_PollEvent(&event))
{
  switch(event.type)
  {
  case SDL_KEYDOWN:
    if(event.key.keysym.sym == SDLK_a)
    {
      if(event.key.keysym.mod & KMOD_SHIFT)
      {
        // Handle 'A'
      }
      else
      {
        // Handle 'a'
      }
    }
    break;

  ...

  }
}
0 голосов
/ 04 октября 2011

Почему бы просто не сделать это?

void keyPressedFn(unsigned char key, int x, int y){
    switch(key){
    case 'a':
    case 'A':
    // do work for A or a
    break;
    }
}

Есть ли у вас другие проблемы, которые вы не можете сделать, как я предлагал? Если нет, то я думаю, что это так просто, как только можно.

0 голосов
/ 04 октября 2011

SDL_keysym имеет поле mod, которое содержит состояние клавиш-модификаторов на момент отправки события. Бит-И это с KMOD_SHIFT, чтобы проверить, был ли активен Shift. См. SDL вики .

...