2017-02-14 25 views
0

我最初使用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

回答

4

渲染和計算不應該在事件輪詢循環內完成,在外部執行。

這是我目前如何做到這一點的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

相關問題