为什么SDL_RenderPresent禁用我的退出事件



我编写了这个程序,它输出我当前鼠标位置的坐标:

#include <sdl.h>
#include <iostream>
int main (int argc, char** argv) {
SDL_Init(SDL_INIT_VIDEO);
bool running = true;
SDL_Window* window = SDL_CreateWindow("testing cursor", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
while(running) {
SDL_SetRenderDrawColor(renderer, 20, 205, 244, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
SDL_Event mouse;
while(SDL_PollEvent(&mouse)){
switch(mouse.type){
case SDL_MOUSEMOTION:
std::cout << mouse.motion.x << " " << mouse.motion.y << 'n';
}
}
SDL_Event quit;
while(SDL_PollEvent(&quit)){
switch(quit.type){
case SDL_QUIT:
running = false;
break;
default:
break;
}
}
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}

但是,由于某些原因,SDL_RenderPresent使我的SDL_Event退出过时。也就是说,如果我删除整个SDL_SetRenderDrawColor,那么程序会正确处理退出(没有背景(,但如果我保持一切原样,那么我就无法正常退出。

我选择的IDE是CodeBlock 20.03,SDL 2版本2.0.14。

原因是第一个循环从队列中提取所有事件,包括SDL_QUIT,而您在其中不处理这些事件,因此此事件总是丢失。第二个循环将永远不会执行,因为此时队列将始终为空。

解决方案是只使用一个事件处理循环:

#include <sdl.h>
#include <iostream>
int main (int argc, char** argv) {
SDL_Init(SDL_INIT_VIDEO);
bool running = true;

SDL_Window* window = SDL_CreateWindow("testing cursor", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

while(running){
SDL_SetRenderDrawColor(renderer, 20, 205, 244, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
SDL_Event event;

while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
running = false;
break;
case SDL_MOUSEMOTION:
std::cout << event.motion.x << " " << event.motion.y << 'n';
break;
}
}
}

SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();

return 0;
}

最新更新