解决SDL2按键检测不一致的问题
Resolving inconsistent SDL2 key press detection?
我正在尝试使用SDL_Event系统检测何时按下某个键。我使用这个代码来检测按键:
void GameLoop::update(SDL_Event eventHandler, Camera &camera){
Vector2 move = Vector2();
if (eventHandler.type == SDL_KEYDOWN){
switch (eventHandler.key.keysym.sym){
case SDLK_w:
move = Vector2(0, -1);
break;
case SDLK_s:
move = Vector2(0, 1);
break;
case SDLK_a:
move = Vector2(-1, 0);
break;
case SDLK_d:
move = Vector2(1, 0);
break;
}
}
camera.translateCamera(move);
}
如果我将"WASD"输入切换为"UP DOWN LEFT RIGHT",系统会工作,如果我删除线路:
if (eventHandler.type == SDL_KEYDOWN){
它的工作原理是SDL_KEYUP类型,使用"WASD"或"UP DOWN LEFT RIGHT">
造成这种行为的原因是什么?如何解决?
SDL确实会检查是否按下了键盘,只是碰巧程序读取速度比实际按下的速度快,这会导致多次按下,我不确定你的上、下、左、右按钮,也许它们是SDL读取的,但它们的物理连接可能与键盘中的字母不一样。
现在,如果你把KEYDOWN改成KEYUP,它会读到的只是如果它是向上的,这不是很好。
你想做的是使用布尔值和勾号
if (eventHandler.type == SDL_KEYDOWN && !clicked){
ticking2 = SDL_GetTicks();
switch (eventHandler.key.keysym.sym){
case SDLK_w:
clicked = true;
break;
case SDLK_s:
clicked = true;
break;
}
}
if (eventHandler.type == SDL_KEYUP && clicked){
ticking = SDL_GetTicks();
switch (eventHandler.key.keysym.sym){
case SDLK_w:
if(ticking-ticking2 >= 3000)
{
move = Vector2(0, -1);
clicked = false;
}
break;
case SDLK_s:
if(ticking-ticking2 >= 3000)
{
move = Vector2(0, 1);
clicked = false;
}
break;
}
}
按下一个按钮,它就会获得时间并将其推入ticking2,但在点击后,它会将点击的bool变成true,然后使它停止读取循环,从而冻结ticking2的值。
释放按钮后,它会检查单击是否为真,以便只有在实际按下按钮时才会执行操作。它得到时间并将其推到滴答作响,ticking-ticking2应该等于0左右,我做这些是为了确保效果不会是即时的,因为它可能会导致一些故障。
相关文章:
- 大于65535的C++数组[size]引发不一致的溢出
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 这种比较是否不一致(或者存在其他问题)?
- C++ "'Shape': cannot instantiate abstract class"找不到问题的根源
- 以下可变参数模板行为是否不一致?
- 如何修复我的链表读数不一致的问题?
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- NDK 问题:在 32 位上崩溃,在 64 位上不一致
- 解决SDL2按键检测不一致的问题
- 遇到getline、fstream、作用域不一致的问题