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

问题描述:

我最初使用glfw编写了我的游戏。然而,由于缺乏Android可移植性,我必须将所有的glfw代码替换为SDL,因为SDL更具可移植性。我可以在不使用嵌入式while_loop的情况下使用SDL检查事件吗?

我的原始游戏循环使用glfw框架工作非常紧张。这是它:

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

好的。编写这个游戏循环可能有更好的方法,但重点在于游戏原型的代码。

但是现在,我正在切换到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 
    } 
} 

但是一个while_loop内这个while_loop已经完全搞砸了游戏渲染!我现在变得闪烁了!有没有其他方法可以像我之前使用glfw一样在单个while_loop中表示此代码。或者是否有任何方法可以在不使用嵌入式while_loop的情况下检查事件

+4

不应该'SDL_PollEvent()'循环只是处理事件?你的渲染代码应该在外面,在你的外部循环中......原样,当你处理一个事件时,你只渲染等...... – Dmitri

渲染和计算不应该在事件轮询循环内完成,在外部执行。

这是我目前如何做到这一点的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); 
    } 
} 
+0

另一个选择是有一个单独的渲染线程,但这是一个不同的故事。 – Matso

+0

@Matso这不会导致计算函数中的坐标不与所绘制的精灵同步吗? – Houssni

+0

当然,如果没有应用同步方法。我只是说,在大型引擎中,通常对于许多不同的东西(渲染,音频,输入等)都有单独的线程。 – Matso