我试图为我的游戏创建一个时钟。我的小时和秒都是浮动值,所以我使用Math.Round将它们四舍五入到最接近的整数。问题是小时和秒数变量根本没有变化。我使用Math.Round错了吗?
public void Update()
{
Hours = (float)Math.Round(Hours, 0);
ClockTime = Hours + ":" + Seconds;
if (Hours >= 24)
Hours = 0;
if (Seconds >= 60)
Seconds = 0;
}
在我的日/夜课程的更新方法中。
float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
clock.Hours += (float)elapsed;
clock.Update();
当我在屏幕上打印数字时,没有任何变化。如果我将(float)强制转换为Math.Round,我会得到一个错误,无法将double转换为float。
答案 0 :(得分:3)
不要使用浮点数,完全没有理由让小时,分钟或秒钟成为非整数。
几乎可以肯定的是,尽管你认为你正在进行四舍五入,但你最终会得到59.9999的浮动值。
假设浮点值的精度高于实际值,确实存在危险。
如果你以无符号积分32位类型保持你的秒数,你可以表示从现在到大约公元2150年的经过时间,如果有人仍然在那时玩你的游戏: - )
然后你只需使用整数计算来计算小时和秒(假设你似乎对分钟不感兴趣),伪代码如:
hours = elapsed_secs / 3600
secs = elapsed_secs % 3600
print hours ":" seconds
除了这个建议之外,你所做的事情似乎有点奇怪。您正在向小时变量添加经过的秒数字段(我假设您已经检查过并且始终设置为零)。随着时间的推移,游戏玩法的速度将达到正常速度的3.5倍。
答案 1 :(得分:0)
实际上,您应该使用DateTime来跟踪您的时间并使用DateTime属性来正确获取小时和秒,而不是使用float自己尝试几秒钟和几小时。 DateTime基于长期,支持从毫秒到千分之几,当然还有几秒。它具有内置的所有功能,可以正确地添加毫秒或数秒或者......或者......这实际上相当困难。