在XNA中重置定时器

我使用一个简单的计时器来计算玩家玩游戏的时间。 60秒后游戏结束。 但是如果玩家再次想玩,定时器继续而不重置! 我怎样才能重设时间?

seconds = gameTime.TotalGameTime.Seconds; if (seconds == 60) { currentGameState = GameState.GameOver; seconds = 0; } 

既然你使用XNA,我认为理想的(和典型的)解决scheme是使用你自己的计时器variables。 你几乎在那里,但是由于其他答案中的评论,你不能使用TotalGameTime ,因为你不能确定这个关卡是否会在游戏开始后的第一秒开始。 当然,如果你没有菜单并且你的游戏立刻运行,并且每60秒重新启动一次,那么这是可能的。 但前进,我相信你会想要使它更强大一点。

所以,你想要做的是创建一个字段variablesfloat seconds; 在你的class级的顶部。 然后,在你的更新中,你想这样做:

 seconds += (float)gameTime.ElapsedGameTime.TotalSeconds; //Add the elapsed seconds so far if (seconds >= 60) { //Check if 60s have elapsed seconds = 0; //Restart the seconds counter //End or restart the game } 

这样,所有你需要做的重置计数器的secondsvariables设置为0 ,它将重新开始计数。

你的第一个问题是Seconds只能是59 ,它每分钟重置为0,永远不会达到60。

检查是否是59 – 或者编写自己的使用TotalSeconds的例程(它将继续增加超过59,但不会重置为0)或其他方式来检测从59到0的转换。

 if (seconds == 59) { ...handle end round.... } 

现在有很多方法可以解决这个问题,这是针对性的

 // When round starts TimeSpan roundStartTime = gameTime.TotalGameTime; // In update loop if (roundStartTime.TotalSeconds.Add(60) >= gameTime.TotalGameTime.TotalSeconds { ....handle end round... } 

你所遇到的问题是TotalGameTime.Seconds从59变为0而不是60,所以它实际上没有达到60,所以这是首先要考虑的问题。 你不能简单地检查TotalGameTime.Seconds == 0,因为你的游戏会在第一个游戏循环中结束时,没有时间真的过去了。

所以你真正要检查的是从游戏时间59转换到0。

因此,你可以做的是这样的:

 int seconds = 0; //a field outside the game loop ... if(gameTime.TotalGameTime.Seconds == 0 && seconds == 59) { //60 seconds have passed, terminate the game now } else { seconds = gameTime.TotalGameTime.Seconds; } 

但请注意以下说明:

固定步长时钟在每个时钟步长上以固定时间跨度进行更新。 这导致统一的时钟步长,可能实际上不跟踪挂钟时间。 固定步进时钟在控制台系统中很stream行,其中一个人对代码有严格的控制,而且系统性能固定。 当尝试为debugging,离线渲染或其他此类场景实现确定性更新时,固定步长时钟也很有用。

这意味着,即使TotalGameTime说60秒已经过去,也可能不是现实世界60秒。 在最坏的情况下,如果一个玩家放慢他的系统,甚至可能是一个可能的漏洞/欺骗,所以你应该探索其他跟踪时间的方法。