我正在尝试使用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'输入到“向上向下左右”'系统有效,如果我删除该行:
if (eventHandler.type == SDL_KEYDOWN){
它的工作原因是SDL_KEYUP类型,使用' WASD'或者“向下左右”'
导致此行为的原因是什么以及如何解决?
答案 0 :(得分:-1)
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,然后使其停止读取循环,从而冻结滴答2的值。 / p>
释放按钮后,它会检查点击是否为真,这样只有在实际按下按钮时才会进行操作。 它得到时间并将其推入滴答滴答,滴答滴答滴答2应该等于0左右,我做了那些以确保效果不会立即发生,因为它可能会引起一些故障。