0

水たまりを飛び越えていると思っていたのですが、代わりに海に落ちました:/

5秒のタイマーを実装しようとしています(ミリ秒以上は必要ありません)。

私の目標:

// I start the program in gamestate 0...
{
    if (button_has_been_pressed == 1)
    {
        gamestate = 1;
    }

}

if (gamestate==1)
{
    //wait for 5 seconds and go to gamestate2
    gamestate = 2;

}

私は次のことを試しました:

  1. GLUT_TIME_ELAPSEDは、プログラムの開始からの時間を測定します。gamestate1に入った後、GLUT_TIME_ELAPSEDを「リセット」できません。そうでなければ、それは素晴らしく機能するでしょう。

  2. gettimeofdayを使用すると、必要以上の解像度が得られます。せいぜいミリ秒が適用可能です。

解像度のニーズに関係なく、SongHoの方法を試しました。

gamestate1_elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;      // sec to ms
gamestate1_elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;   // us to ms

// add that elapsed time together, and keep track of its total

//r_gamestate1_elapsedTime_total = gamestate1_elapsedTime;
//if (r_gamestate1_elapsedTime_total > 5 seconds) ...

ただし、gamestate1_elapsedTimeにはある程度の変動があるようです。出力が一貫していることはめったにないためです。gettimeofdayはCPU時間(?)を使用していると思いますが、これをfpsクランプで人為的にクランプしています。

  1. clock()も試しましたが、これもCPU時間であり、実時間ではないようです。

上記のように、GLUT_ELAPSED_TIMEは正常に機能しますが、プログラムの途中でリセットできず、5秒が最初のボタンクリックに依存しなくなりました。

何かアドバイスをいただければ、正しい方向に少しでも進んでいただければ幸いです。事前にどうもありがとうございました。

-kropcke

4

1 に答える 1

0

GLUT_ELAPSED_TIMEを「リセット」する必要はありません。オフセットとして使用できる場所にコピーするだけです。例えば:

int timeAtReset = glutGet(GLUT_ELAPSED_TIME);

// I start the program in gamestate 0...
{
    if (button_has_been_pressed == 1)
    {
        gamestate = 1;
        timeAtReset = glutGet(GLUT_ELAPSED_TIME);
    }

}

if (gamestate==1)
{
    int timeSinceReset = glutGet(GLUT_ELAPSED_TIME) - timeAtReset;
    // use timeSinceReset, instead of glutGet(GLUT_ELAPSED_TIME), to
    // wait for 5 seconds and go to gamestate2
    gamestate = 2;

}
于 2012-07-17T19:35:42.107 に答える