0

ゲームの実行速度を制限するゲーム ループを実装して、最大 fps 速度で実行しようとしています。何らかの理由でコードがフリーズし、最初の繰り返しに合格しません。

コードはかなり短く、次のようになります。

int main(int argc, char *argv[])
{
short int end = 0;
struct Escenario level;
struct Personaje player;
SDL_Surface* screen = NULL;
Uint32 next_frame_tick = 0;
Uint32 sleep_time = 0;

readLevelFile( &level, &player );
screen = initSDL();
showBackground(level, screen    );

while(!end){

    erasePlayer(&player, screen);

    end = manageKeyboardKeys( &player );
    detectCollisionsAndMove( level, &player );

    showPlayer(player, screen );

    next_frame_tick += SKIP_TICKS;
    sleep_time = next_frame_tick - SDL_GetTicks();

    if( sleep_time > 0 ) SDL_Delay( sleep_time );

}

freeMemory(nivel);
SDL_Quit(); 

return 0;

}

sleep_time > 0 を参照する if 条件を削除すると、動かなくなりますが、私が望むことはしません。私はその行を次のように置き換えようとしました:

while( ( next_frame_tick - SDL_GetTicks() ) > 0 ) 
{
}

どちらもうまくいかないので、アイデアが不足しています... 誰でもこれで少し手伝ってもらえますか?

前もって感謝します

4

1 に答える 1

3

ここで符号なしオーバーフローが発生しています:

sleep_time = next_frame_tick - SDL_GetTicks();

next_frame_tick<の場合、この行で何が起こりSDL_GetTicks()ますか?

2つの符号なしの値の差が得られます。これは負ではありませんが、関係するすべてのタイプが符号なしであるため、正になります。

この場合、差の値は単なる-ではなく232 + next_frame_tick-になります。SDL_GetTicks()next_frame_tickSDL_GetTicks()

代わりにすべきことは次のとおりです。

ticks = SDL_GetTicks(); // ticks time is another Uint32
sleep_time = (next_frame_tick >= ticks) ? next_frame_tick - ticks : 0;
于 2012-09-28T23:01:03.453 に答える