在我正在开发的游戏中使用Mathhelper.Clamp时遇到问题。这是引起我问题的代码片段:
if (background.position.Y == 0)
{
player.position.Y = MathHelper.Clamp(player.position.Y, 0, viewport.Height / 2);
}
if (Math.Abs(background.position.Y) == background.sprite.Height - viewport.Height / 2)
{
player.position.Y = MathHelper.Clamp(player.position.Y, viewport.Height / 2, viewport.Height - player.sprite.Height);
}
if (player.position.Y == viewport.Height / 2)
{
background.position.Y = MathHelper.Clamp(background.position.Y, -(background.sprite.Height - viewport.Height / 2), 0);
}
本质上,我希望完成的工作是(从x,0开始)让玩家精灵向下移动直到到达屏幕中间,然后背景才会移动,直到到达背景底部减去一半为止。屏幕高度,则播放器精灵将再次移动,直到到达屏幕底部为止。 (我有执行此操作的代码)-对我来说,这似乎是2D侧滑车的非常典型的相机功能。
但是,我遇到的问题是,位置没有准确地固定在应有的数字上,这意味着依赖于它们的位置特别严格的代码也正在中断。更具体地说,似乎允许超出夹紧点的额外一帧运动。
谁能告诉我是否有这个原因不起作用,或者我可以做些什么使它起作用?提前致谢!
最佳答案
要比较浮点数,请不要使用==
,因为这几乎总是错误的。由于浮点数的精度有限,因此应始终查看它们之间的差是否小于给定的epsilon。
像这样:
// Difference less than one tenthousandth should be considered equal
private const float Epsilon = 0.0001;
public static bool FloatEquals(float f1, float f2)
{
return Math.Abs(f1 - f2) < Epsilon;
}
关于c# - Mathhelper.Clamp不精确吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9077737/