【问题标题】:SDL 2.0 Keyboard HandlingSDL 2.0 键盘处理
【发布时间】:2014-03-21 13:24:53
【问题描述】:

我正在编写一个非常简单的示例程序,它仅向您显示“是否按下了一个键”一次,只要我按下任意数量的键(我按下一个键、两个键或更多),就会触发按键事件),当发生 SDL_KEYUP 事件而按下的键数仅为 1 个键时触发键释放事件,此示例在箭头键上完美运行,但是对于其他键,只要我按下多个键并仅释放其中一个键他们触发了“键已释放”消息,然后是“按下了键”,我未能找到问题所在。

我的代码:

#include <iostream>
#include <SDL2/SDL.h>

using namespace std;
SDL_Event input;


int main(int argc, const char * argv[])
{
SDL_Init(SDL_INIT_EVERYTHING);


int y = 0;
int z = 0;
int w = 0;
bool key = false;

const Uint8 *state = SDL_GetKeyboardState(NULL);


while (1){
   w = 0;
   SDL_PollEvent(&input);

  //check for events generated

   switch (input.type) {
       case SDL_KEYDOWN:  
           key = true;
           break;
           case SDL_KEYUP:
           key = false;
           break;

       default:
           break;
   }



  // Check for no. of keys pressed using ASCII code

    for (y = 48;y<=127;y++)
        if(state[y] == 1)
            w++;


   // Display the messages

   if (key && z==0 )
   {
       cout << "Key is Pressed" << endl;
       z = 1;
   }
   else if (!key && w < 1 && z==1)
   {
       cout << "Key is released" << endl;
       z = 0;

   }



}

return 0;
 }

【问题讨论】:

  • 如果你的for循环包含多行代码,你需要{}括号,仅供参考
  • @Cyber​​ 我不认为这是 for 循环触发 if 语句的问题,而 if 语句又触发了以下一条语句,因此括号不会改变任何内容。
  • 您是否已经通过调试器确认了这一点?我持怀疑态度。这可能不是问题的原因,但我怀疑它的行为不正确。
  • @Cyber​​ 我刚刚检查了循环线程,该循环没有任何问题。

标签: c++ keyboard keyboard-events sdl-2


【解决方案1】:

问题在于 for 循环的初始化,SDL 2 没有对字符使用相同的 ASCII 枚举,因此我的代码在将代码更改为后倾向于忽略 (48-127) 范围之外的代码枚举:

for (y = 0;y<=127;y++)
if(state[y] == 1)
        w++;

问题解决了

【讨论】:

    猜你喜欢
    • 2013-12-31
    • 2012-03-04
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多