是否可以在不使用嵌入式while_loop的情况下使用SDL检查事件?

Mag*_*ler 0 c c++ sdl glfw game-loop

我最初使用glfw编写游戏。但是由于缺少android的可移植性,我不得不用SDL替换所有glfw代码,因为SDL更易于移植。

我使用glfw框架工作的原始游戏循环非常出色。这里是:

// game loop
while (!glfwWindowShouldClose(window)) {
    //if-else statements that create  
    //the games state machine
    //player input is received here
    //rendering done here
}
Run Code Online (Sandbox Code Playgroud)

好。编写此游戏循环可能有更好的方法,但重点是适用于游戏原型的代码。

但是,现在我切换到SDL时遇到了一个问题。似乎必须将SDL_Event放入while循环中以不断检查事件。并且此while_loop在另一个while_loop中。所以我的代码看起来像这样:

while(!Quit) {
    SDL_Event event;
    while(SDL_PollEvent(&event)) {
        //if-else statements that create  
        //the games state machine
        //player input is received here
        //rendering done here
    }
}
Run Code Online (Sandbox Code Playgroud)

但是while_loop中的while_loop完全弄乱了游戏的渲染!我现在忽隐忽现!是否有其他方法可以像我之前使用glfw一样在单个while_loop中表达此代码。还是有任何方法可以在不使用嵌入式while_loop的情况下检查事件

h0u*_*sni 5

渲染和计算不应在事件轮询循环内进行,而应在外部进行。

这就是我目前在SDL2中为用编写的游戏所做的工作:

while (!quit) {
    start_frame_ms = SDL_GetTicks();

    /* Event polling */
    while (SDL_PollEvent(&event)) {
        joystick_event(&event);
        keyboard_event(&event);
    }

    /* Calculations */
    players_move();
    enemies_move();

    /* Rendering */
    draw_sprites();

    /* Lock FPS to 60 */
    end_frame_ms = start_frame_ms - SDL_GetTicks();
    if (end_frame_ms < FPMS) {
        SDL_Delay(FPMS - end_frame_ms);
    }
}
Run Code Online (Sandbox Code Playgroud)