我正在使用SDL 2.0,我无法让SDL_GetKeyboardState
按预期工作。玩家应该上下移动,但这不会发生。
void Movements() {
const Uint8 *currentKey = SDL_GetKeyboardState(NULL); // Point has to be defined once
if (currentKey[SDLK_w]){
PlayerPaddle.y = PlayerPaddle.y+2;
}
if (currentKey[SDLK_s]){
PlayerPaddle.y = PlayerPaddle.y+2;
}
}
int main(int argc, char* args[]) {
main_menue();
bool running = true;
while (running == true) {
SDL_PollEvent(&occur);
if (occur.type == SDL_QUIT) { // Closes the window, if user stops running
running = false;
}
Movements();
}
}
我还试图用PumpEvents
打开事件循环,但仍无法读取密钥的当前状态。我也在stackoverflow(SDL_GetKeyboardState not working)上找到了这个,但那里的答案并没有帮我找到解决方案。我在这里错过了什么吗?我真的失明并且误解了什么吗?
答案 0 :(得分:0)
假设SDL_Init()
和其他声明在粘贴时刚刚删除。
首先,您没有使用正确的索引。 正如in the documentation here所解释的那样:“使用SDL_Scancode values获取此数组的索引。”但是您使用的是SDL_Keycode值。
另一个问题是你在每次迭代时使用非阻塞SDL_PollEvent
并调用Movements()
,并且在循环中没有任何阻塞或等待。这将使用100%的CPU,尽可能快地运行,并且你最终会得到一个非常高的y
值......
您可以使用关键事件代替SDL_GetKeyboardState
返回的数组。如果occur.type
例如是SDL_KEYDOWN
,则occur.key.keysym.sym
是所按下的键的SDL_Keycode
。有关详细信息,请查看SDL_Event
和其他事件类型的文档。
您还应该在循环中添加SDL_Delay
。
另一种方法是使用SDL_WaitEvent
,它仅在事件发生时返回。然后你处理事件,如果它是按键,按键做一些动作等等......