【问题标题】:SDL Get Keyboard State without using EventsSDL 在不使用事件的情况下获取键盘状态
【发布时间】:2013-07-08 22:40:54
【问题描述】:

有谁知道如何让 SDL_GetKeyState 正常工作,而不必设置轮询 SDL 事件的循环?

int *keystates;
keystates = SDL_GetKeyState(NULL);
SDL_PumpEvents();
std::cout << "Test 1\n";
if (keystates[SDLK_F1]) {
    std::cout << "Test 1 Okay\n";
    key_ac = true;
    emu->setPower(true);
}

这段代码每秒运行超过 100 次,但是即使我按住 F1 键,我仍然没有得到任何输出表明它是成功的。

我没有 SDL 事件循环,所以这可能是因为我没有使用事件而被丢弃吗?在这种情况下,如何让 SDL 过滤掉所有事件?

【问题讨论】:

  • 您的具体问题/问题是什么?如何让事情 A 工作太广泛了。
  • 如何让 SDL_GetKeyState 正常工作,而无需设置轮询 SDL 事件的循环?对不起,我应该让它更清楚一点
  • 按照文档中的说明使用它,而不是使用事件循环。
  • 文档状态“注意:使用 SDL_PumpEvents 更新状态数组。”但是,这在我的情况下不起作用。
  • 那么就让它发挥作用吧,我可以根据您提供的信息提供尽可能多的帮助。

标签: c++ events keyboard gtk sdl


【解决方案1】:

SDL_GetKeyState() 只需在程序开始时调用一次。

unsigned char * keys = SDL_GetKeyState(NULL);

然后它返回的值,一个指向数组的无符号字符指针被存储在内部。要更新数组的状态,请调用函数SDL_PumpEvents()

在主循环中更新数组keys

SDL_PumpEvents();

if( keys[ SDLK_m ] )
{
    //do stuff
}

编辑: 您可以在第一次调用后尽可能多地调用SDL_GetKeyState(),并且不会造成内存泄漏。该函数总是返回相同的指针。

【讨论】:

  • 这对我来说很好用。我刚刚发现我的问题是由于我同时使用 GTK 和 SDL,似乎 SDL 在与 GTK 一起使用时无法正确处理事件。不过,我会将此解决方案标记为正确的,因为在正常情况下,这是正确的答案。对我来说,我认为我将不得不研究一种让 gtk 处理键盘输入或将它们传递给 sdl 的方法。但这是一个完全不同的问题。
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2014-10-25
相关资源
最近更新 更多