【问题标题】:Mathhelper.Clamp not exact?Mathhelper.Clamp 不准确?
【发布时间】:2013-08-18 16:46:39
【问题描述】:

我在正在开发的游戏中使用 Mathhelper.Clamp 时遇到了问题。这是导致我出现问题的代码的 sn-p:

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 横向卷轴的典型相机功能。

但是,我遇到的问题是位置并没有准确地固定在应有的数字上,这意味着依赖于它们被如此特别放置的代码也被破坏了。更具体地说,似乎允许在夹紧点之外多移动一帧。

谁能告诉我这不应该起作用的原因,或者我可以做些什么来使它起作用?提前致谢!

【问题讨论】:

    标签: c# xna clamp


    【解决方案1】:

    要比较浮点数,您永远不应该使用==,因为这几乎总是错误的。由于浮点数只有有限的精度,您应该始终查看它们之间的差异是否小于给定的 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;
    }
    

    【讨论】:

    • 没错,像 2f/10f 这样的函数可能不等于 0.2f,因为浮点精度可能会导致 0.19999998~,不幸的是,很难注意到,因为调试器会尝试转换这些看的时候变成可读的格式。奇怪的是 c# 有这么多关于潜在编程错误的警告,这个仍然有效。
    • 感谢您的洞察力,我从未意识到浮点数如此不准确。我想我可能只是修改代码并改用整数。在这种情况下,我不需要分数,但是当我这样做的时候,绝对需要牢记这一点。
    【解决方案2】:

    我意识到我做错了什么,让玩家位置移动到我的钳位范围之外......我将钳位代码放在移动代码之前。重新排列它们就解决了这个问题!

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2013-09-21
      • 2021-07-28
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多