我有一个自行旋转的立方体和一个按下按键时旋转的立方体。问题在于,自行旋转的旋转总是比仅在按下按键时旋转的旋转更快(快得多)。
while(!quit())
{
handleInput();
update();
render();
}
当我将旋转放在这里时:
update()
{
cube.rotation += 0.09f;
}
立方体旋转得很快。
但是当我把它放在这里时:
handleinput()
{
while(pollevent(&event))
{
if(event.type == keydown)
{
if(event.key.symbol == KEY_r )
{
cube.rotation += 0.09f;
}
}
}
速度要慢得多。尽管我认为当按住按键时,每个循环都应该调用一次。
而且我不知道这个问题必须标记什么。
最佳答案
您的 keydown
事件触发频率低于您的游戏逻辑更新频率。
常见的解决方案是跟踪键盘的状态。
SDL方式
我建议将键盘状态存储为 bool 数组,其大小是您要检查的键的数量,例如 bool [SDL_KEYLAST]
。
因此,每当事件被触发时,您都必须修改它。最后,在每个循环中,检查保存的键盘状态。
示例代码:
handleInput()
{
while(pollEvent(&ev))
{
if(event.type = keydown)
ks[event.key.symbol] = true;
else if(event.type = keyup)
ks[event.key.symbol] = false;
}
}
update()
{
if(ks[KEY_R]) cube.rotation += 0.05f;
}
SDL2方式
const Uint8* ks = SDL_GetKeyboardState(NULL)
。
此函数返回键盘状态数组,它不是 bool[]
而是包含 0/1 值的 Uint8[]
(因此您仍然可以检查 false/真值)。
而且,如果您想使用该数组,则必须检查 SDL_Scancode
索引值,如下所示:https://wiki.libsdl.org/SDL_Scancode
handleinput()
{
//pump events so that SDL can update the keyboard state array...
}
update()
{
const Uint8* ks = SDL_GetKeyboardState(NULL);
if(ks[SDL_SCANCODE_R]) cube.rotation += 0.05f;
}
关于c++ - 为什么事件轮询循环中的函数触发频率低于其外部的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28070460/