【发布时间】:2013-12-16 20:41:08
【问题描述】:
我有以下代码 是一些在屏幕上移动一个点的功能的一部分。 我正在使用 SDL
if(SDL_PollEvent(&event)){
//BreakPoint A
if(event.type == SDL_KEYDOWN)
if(event.key.keysym.sym == SDLK_d){
goLeft = true;
//BreakPoint B
}
else if(event.type == SDL_KEYUP)
if(event.key.keysym.sym == SDLK_d){
goLeft = false;
//BreakPoint C
}
else{
//BreakPoint D
}
}
//BreakPoint E
//Move sprites and other things..
//Update screen ..
所有这些都在一个循环中。每次运行此循环时,都会对点的移动进行计算并渲染一帧。 我的问题是,当我连续按 'D' 时,离开按钮后点 不会立即停止。
更改if(SDL_PollEvent(&event)){
到while(SDL_PollEvent(&event)){
一切正常。为什么会这样?
一个假设是,通过连续按“D”,事件队列会被键盘输入事件淹没。这些事件中有很多被插入到事件队列中,所有这些都发生在一帧渲染或一次迭代中我在上面所说的循环中,但是在每一帧上我只从队列中删除一个事件。所以当我离开“D”按钮时,不再插入任何事件并且“额外”移动发生,因为要获得“D”的事件' 已被释放并更新 goLeft 变量我必须首先删除所有那些充斥队列的事件。所以在这些事件被释放之前,点将移动。
但是如果我有while(SDL_PollEvent(&event)){ 并且连续按下“D”,它会离开这个内部循环吗?因为这个循环是在队列中有事件时运行的,正如我所说,我通过按“D”连续插入它们。
编辑
正如我在 while 循环中所说的,它工作正常,并且实际上从循环中逃脱了。它是如何发生的?
从我所做的一些测试中,我看到当连续按“D”时,程序在每个外部循环迭代上执行如下:
- 断点A
- B 断点
- 断点A
- 断点C
- 断点 E
【问题讨论】:
标签: c++ event-handling sdl keyboard-events