如手册所述,函数SDL_PollEvent
“如果有挂起的事件返回1,如果没有可用的事件返回0”,这就是为什么我们使用测试SDL_PollEvent(&e)!=0
( e
是SDL_Event
)的原因。
但是,如何使用这个测试:!SDL_PollEvent(&e)
呢?它应该能用,但很明显它会引起一些问题。
这里有一个代码示例:
#include <SDL2/SDL.h>
#include <stdio.h>
int main(int argc, char* args[]){
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindow("Hello",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 100, 100, SDL_WINDOW_SHOWN);
SDL_Event e;
int quit=0;
while(!quit){
//Here the test
while (!SDL_PollEvent(&e)){
if (e.type==SDL_QUIT)
quit=1;
else if ( e.type == SDL_KEYDOWN )
printf( "Hello\n" );
}
}
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
这段代码应该做的是打开一个新窗口,每次按下键时在控制台中打印"Hello“。这段代码可以很好地测试SDL_PollEvent(&e)!=0
,但是当我使用测试!SDL_PollEvent(&e)
时,它不会读取SDL_KEYDOWN
事件(但是它确实在!SDL_PollEvent(&e)
中输入并没有任何问题地处理SDL_QUIT
事件)。
为什么会有这种行为?
发布于 2015-04-17 18:43:38
while (!SDL_PollEvent(&e))
需要:
while (SDL_PollEvent(&e))
如果应该与SDL_PollEvent(&e) != 0
相同
因为!SDL_PollEvent(&e)
与调用while(0)
相同
发布于 2015-04-17 18:43:48
(1 != 0)
是真的,但(!1)
是假的。
无论如何,您可能应该使用SDL_WaitEvent
。
发布于 2021-05-16 06:55:49
增编
人们可能会认为这样做更清楚,因为这样可以确保用户的输入得到响应。然而,这是一个操作系统依赖的,可能是疯狂的CPU占用,并将最大化您的CPU这个线程(在Windows上)。所以你可能认为你可以在那里等待1秒,但是你的窗口会变得完全没有响应或者充其量是非常滞后的.如果你可以忍受一点CPU开销而什么也不做,那么你可以折衷使用20-100毫秒的延迟。
...
// Set the event handler...
...
bool isRunning = true;
while (isRunning) {
// Do the main thing here...
...
while(SDL_PollEvent(&windowEvent)) {
switch (windowEvent.type) {
case SDL_QUIT: isRunning = false;
case SDL_KEYDOWN: isRunning = false;
case SDL_MOUSEBUTTONDOWN: isRunning = false;
break;
}
SDL_Delay(100); // Wrong!
}
}
// End the program
所以很明显,这也不是正确的方法。我们需要使用其他机制。看一看SDL回购,我们发现了一个关于公开问题的长期但非常相关的讨论:
修复问题
确保将延迟放在外部循环中,在SDL_PollEvent()
之前。
// main loop
...
while(SDL_PollEvent(&windowEvent)) {
switch (windowEvent.type) {
case SDL_QUIT: isRunning = false;
case SDL_KEYDOWN: isRunning = false;
case SDL_MOUSEBUTTONDOWN: isRunning = false;
break;
}
}
SDL_Delay(100); // Right!
}
https://stackoverflow.com/questions/29706885
复制相似问题