SDL2基于时间的事件实现问题:5秒后无法切换屏幕
解决SDL2中基于时间的屏幕切换问题
问题根源
你的代码核心问题是状态切换逻辑完全依赖SDL事件触发:fEvent1()只在SDL_PollEvent循环内执行,只有当鼠标移动、按键按下这类事件发生时,这个函数才会被调用。当5秒计时到了boo2被设为true后,如果没有任何事件触发,fEvent1()根本不会运行,自然无法切换fptrEvent到fEvent2,也就没法触发后续的渲染函数切换。此外你的Crono类也未正确记录起始时间,导致计时逻辑错误。
修复方案
1. 修正计时器类
让Crono正确保存起始时间,精准计算计时启动后的流逝时长:
class Crono { private: Uint32 startTime; public: Crono() : startTime(0) {} void starting() { startTime = SDL_GetTicks(); // 记录计时启动时的时间点 } Uint32 getElapsedTime() { return SDL_GetTicks() - startTime; // 返回从启动到现在的时间差 } };
2. 调整状态切换逻辑
不再依赖事件触发状态更新,直接在渲染流程里完成完整的状态切换:
void (*fptrEvent)(); void (*fptrRender)(); Crono cro1; bool boo2 = false; SDL_Event eve; bool end = false; // 补充缺失的循环终止变量初始化 void fEvent1() { // 第一屏事件处理逻辑 if (eve.type == SDL_QUIT) { end = true; } } void fRender1() { // 第一屏渲染逻辑 if (cro1.getElapsedTime() > 5000) { // 时间条件满足时直接完成状态切换 fptrEvent = &fEvent2; fptrRender = &fRender2; } } void fEvent2() { // 第二屏事件处理逻辑 if (eve.type == SDL_QUIT) { end = true; } } void fRender2() { // 第二屏渲染逻辑 } int main(int argc, char* args[]) { Window wind(1280, 720); fptrEvent = &fEvent1; fptrRender = &fRender1; cro1.starting(); // 启动计时 while (!end) { while (SDL_PollEvent(&eve) != 0) { fptrEvent(); } wind.RenderDrawColor(); wind.RenderClear(); fptrRender(); wind.RenderPresent(); } return 0; }
关键改动说明
- 把状态切换逻辑从事件处理函数移到渲染函数中,主循环每次执行渲染时都会检查时间条件,一旦满足就直接切换事件和渲染函数,不再依赖SDL事件触发。
- 修复
Crono类的计时逻辑,现在能准确计算从starting()调用后流逝的时间,而非程序启动后的总时长。 - 补充了缺失的
end变量初始化,避免未定义行为。
内容的提问来源于stack exchange,提问作者user7298892
相关产品推荐
相关产品推荐

