在SDL和c++中处理关键事件

Handling key events in SDL and C++

本文关键字:事件 处理 SDL c++      更新时间:2023-10-16

我正在将一个程序从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中复制上述函数?

Edit:在上面的例子中,我只展示了如何处理一个键,但是在实践中,我将有一个大约15个键的列表,如果shift键被按下,我想以不同的方式响应。

检查获得keydown事件时出现的键盘修饰符。例如:

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

SDL_keysym具有mod字段,其中包含事件发出时修饰符键的状态。Bit-AND - it与KMOD_SHIFT一起检查Shift是否已激活。

为什么不这样做呢?

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

你还有其他不能按照我的建议去做的事情吗?如果不是,我想这是最简单的了。