You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 04:52:45