【问题标题】:Handling key events in SDL and C++在 SDL 和 C++ 中处理关键事件
【发布时间】:2011-10-04 17:26:06
【问题描述】:

我正在将程序从 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 个键的列表,我希望在换档时做出不同的响应键也被按下。

【问题讨论】:

    标签: c++ keyboard sdl


    【解决方案1】:

    在收到 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;
    
      ...
    
      }
    }
    

    【讨论】:

    • 谢谢,这基本上就是我想要的。但是,如果我想对 10 个键(小写和大写)有 20 个不同的响应,这似乎不能很好地扩展
    • @slayton,创建一个布尔数组来跟踪哪个键被按下。
    【解决方案2】:

    SDL_keysymmod 字段,其中包含事件发出时修饰键的状态。与KMOD_SHIFT 位与以检查 Shift 是否已激活。见SDL wiki

    【讨论】:

      【解决方案3】:

      为什么不这样做呢?

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

      您是否还有其他无法按照我的建议去做的顾虑?如果不是,我认为这很简单。

      【讨论】:

      • 因为 SDL KeyEvents 没有那么简单。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 2013-07-04
      相关资源
      最近更新 更多