【问题标题】:How to disable key repeat in SDL2?如何在 SDL2 中禁用键重复?
【发布时间】:2014-04-05 02:16:04
【问题描述】:

在 SDL 中曾经有一个名为 SDL_EnableKeyRepeat() 的函数,但在 SDL2 中不再存在。

我在 SDL2-wiki 中四处搜索,但没有找到任何相关内容。

有什么想法吗?

【问题讨论】:

  • 如果这些答案真的是最好的解决方案,那似乎是错误的。 “key down”应该是指物理按下键时。任何类型的自动重复都应该是可选行为。

标签: sdl sdl-2


【解决方案1】:

在处理键盘事件时,只需过滤掉所有重复事件,即检查SDL_Event union 的SDL_KeyboardEvent 的repeat 字段。

例如:

SDL_Event event;
while (SDL_PollEvent(&event)) {
  if (event.type == SDL_QUIT) {
    quit = true;
  }
  if (event.type == SDL_KEYDOWN && event.key.repeat == 0) {
    if (event.key.keysym.sym == SDLK_d)
      debug = debug ? false : true;
    // ... handle other keys
  }
}

见https://wiki.libsdl.org/SDL_KeyboardEvent

【讨论】:

  • 生成的所有由于重复而未处理的事件怎么办?有办法禁用“键重复”事件不是更好吗?并且只是接收向上/向下键?
【解决方案2】:

SDL_GetKeyboardState 函数可能会更好地为您服务,它会告诉您所有按下的键。您也可以只检查事件中的repeat 标志,并在重复为真时忽略。

【讨论】:

  • 非常好的横向方法。
【解决方案3】:

您可以自己做,通过将“向下”键添加到列表中并在捕获 KEY_UP 时将其删除,并且在每一帧您可以迭代列表以了解哪个键仍然向下。

【讨论】:

  • 这听起来完全可行,但这不应该是标准功能吗?我只是在寻找模仿 SDL_EnableKeyRepeat 的那个:) 感谢您的回答。
  • 生成的所有由于重复而未处理的事件怎么办?有办法禁用“键重复”事件不是更好吗?并且只是接收向上/向下键?
猜你喜欢
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多