2017-02-14 6 views
0

私はもともとglfwを使って自分のゲームを書いていました。しかし、それはアンドロイドの移植性の欠如のために私はSDLと私のglfwコードのすべてを置き換える必要があるので、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

関連する問題