水たまりを飛び越えていると思っていたのですが、代わりに海に落ちました:/
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;
}
私は次のことを試しました:
GLUT_TIME_ELAPSEDは、プログラムの開始からの時間を測定します。gamestate1に入った後、GLUT_TIME_ELAPSEDを「リセット」できません。そうでなければ、それは素晴らしく機能するでしょう。
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クランプで人為的にクランプしています。
- clock()も試しましたが、これもCPU時間であり、実時間ではないようです。
上記のように、GLUT_ELAPSED_TIMEは正常に機能しますが、プログラムの途中でリセットできず、5秒が最初のボタンクリックに依存しなくなりました。
何かアドバイスをいただければ、正しい方向に少しでも進んでいただければ幸いです。事前にどうもありがとうございました。
-kropcke