C# Mathhelper,钳子不准确?

C# Mathhelper,钳子不准确?,c#,xna,clamp,C#,Xna,Clamp,我在使用Mathhelper时遇到了一个问题。我正在制作一个游戏。下面是给我带来问题的代码片段: 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.Heig

我在使用Mathhelper时遇到了一个问题。我正在制作一个游戏。下面是给我带来问题的代码片段:

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侧卷轴非常典型的相机功能

然而,我遇到的问题是,这些位置并没有精确地夹紧在它们应该是的数字上,这意味着依赖于它们被如此特别地放置的代码也被破坏了。更具体地说,它看起来像是一个额外的帧值的运动被允许超出夹紧点


有没有人能告诉我为什么这不起作用,或者我能做些什么让它起作用?提前谢谢

要比较浮点数,千万不要使用
=
,因为这几乎总是错误的。由于浮点数的精度有限,您应该始终查看它们之间的差值是否小于给定的ε

像这样:

// 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;
}
//小于十分之一的差值应视为相等
私有常量浮点ε=0.0001;
公共静态布尔浮点(浮点f1,浮点f2)
{
返回Math.Abs(f1-f2)
要比较浮点数,永远不要使用
=
,因为这几乎总是错误的。由于浮点数的精度有限,您应该始终查看它们之间的差值是否小于给定的ε

像这样:

// 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;
}
//小于十分之一的差值应视为相等
私有常量浮点ε=0.0001;
公共静态布尔浮点(浮点f1,浮点f2)
{
返回Math.Abs(f1-f2)
我意识到我做错了什么,让球员的位置超出了我的夹钳的界限……我把夹钳代码放在了移动代码之前。重新安排他们就可以解决这个问题了

我意识到我做错了什么,让球员的位置移动到我的夹钳边界之外……我把夹钳代码放在移动代码之前。重新安排他们就可以解决这个问题了

确切地说,像2f/10f这样的函数可能不等于0.2f,因为浮点精度可能会导致0.19999998~,不幸的是,很难注意到这一点,因为在您观看时调试器会尝试将其转换为可读格式。奇怪的是,c#有那么多关于潜在编程错误的警告,这一条仍然有效。感谢你的洞察力,我从未意识到浮点值如此不准确。我想我可以修改一下代码,改用ints。在这种情况下,我不需要分数,但在我需要分数的时候一定要记住。确切地说,像2f/10f这样的函数可能不等于0.2f,因为由于浮点精度,它可能会导致0.19999998~,不幸的是,很难注意到,当调试器试图在您观看时将其转换为可读格式时。奇怪的是,c#有那么多关于潜在编程错误的警告,这一条仍然有效。感谢你的洞察力,我从未意识到浮点值如此不准确。我想我可以修改一下代码,改用ints。在这种情况下,我不需要分数,但当我需要分数时,一定要记住分数。