bool IsGameEnded()
{
static int i = 0;
i++;
if (i == 10)
return true;
return false;
}
int main()
{
bool GameEnd = false;
float ElapsedTime = 0;
while(!GameEnd)
{
chrono::steady_clock::time_point StartingTime = chrono::steady_clock::now();
if (ElapsedTime > 10)
{
ElapsedTime = 0;
draw();
}
GameEnd = IsGameEnded();
chrono::steady_clock::time_point EndingTime = chrono::steady_clock::now();
ElapsedTime = ElapsedTime + chrono::duration_cast<chrono::milliseconds>(EndingTime - StartingTime).count();
}
return 0;
}
我不想玩蛇游戏。它将以时间为基础。例如,屏幕将每5秒左右更新一次。为此,我使用了chrono库。我不习惯这种尝试,所以我可能错过了一些显而易见的东西。但问题是主函数没有进入if块。因此,它不会在控制台上绘制任何内容。
我试着调试(逐行运行(。它实际上不像一个正在运行的程序,因为时间间隔会变长,但每次都会进入if块。此外,如果我将if条件设置为2纳秒,它也可以工作,但由于cout函数不能打印得这么快,我需要它比这长得多。在调试时,我也意识到";开始时间";以及";结束时间";变量不会被启动(除非我直接停止(。有趣的部分是Ifı在If块之后添加cout,过一段时间程序开始进入If块。
当你这样做时:
chrono::duration_cast<chrono::milliseconds>(EndingTime - StartingTime).count();
时间不够,毫秒计数总是返回0。这意味着您总是将0添加到ElapsedTime
,并且它永远不会超过10。
一个解决方案是使用较小的分辨率:
chrono::duration_cast<chrono::nanoseconds>(EndingTime - StartingTime).count();
正如您在问题中提到的,并适当调整if
条件。
然而,最好的解决方案是将ElapsedTime
从float
更改为chrono::duration
(适当单位(,因为这是变量所代表的单位。这样可以避免在持续时间上执行.count()
。