在我正在制作的游戏中使用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侧面滚轮的典型相机功能。
但是,我遇到的问题是这些位置并没有完全按照它们应该的数字进行钳位,这意味着依赖于它们的代码也是如此具体地放置了。更具体地说,它似乎允许超出钳位点的一个额外帧移动。
任何人都可以告诉我,为什么这不应该起作用,或者我能做些什么才能让它发挥作用?提前谢谢!
答案 0 :(得分:4)
要比较浮点数,您绝不应该使用==
,因为这几乎总是错误的。由于浮点数的精度有限,因此总是看它们之间的差异是否小于给定的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;
}
答案 1 :(得分:0)
我意识到我做错了让玩家位置移动到我的夹子边界之外......我把夹子代码放在移动代码之前。重新排列它们就清理了!