1

目前,我的游戏使用了一些像素检测。例如,对于精灵,我检索其位置的像素。当我移动它时,位置值有一些小数,如:

thePixel = new vector(position.X, position.Y);
//thePixel = (52.2451, 635.2642)

所以我必须四舍五入这些值

thePixel = new vector((float)Math.Round(position.X, 0), (float)Math.Round(position.Y, 0));
//thePixel = (52, 635)

我想知道是否有其他方法可以在不四舍五入的情况下获得完美的位置(意味着没有小数)。这可能是一个移动方法问题吗?

感谢阅读,希望对您有所帮助。

4

1 回答 1

3

您无法真正绕过对值进行四舍五入的需要,但您可以通过使用扩展方法使其编码变得更好:

public static class Vector2Extensions
{
    public static Vector2 Floor(this Vector2 vector)
    {
        return new Vector2((float)Math.Floor(vector.X), (float)Math.Floor(vector.Y));
    }
}

(如您所见,我个人更喜欢FloorRound我也有一个Ceiling。)

然后你可以像这样使用它:

HandleCollision(position.Floor());

当然,如果您正在执行逐像素碰撞检测 - 您的碰撞数学可能应该是基于整数的(不存储为floata Vector2)。你可以使用Point. 原来我也有一个扩展方法:

public static class Vector2Extensions
{
    public static Point AsXnaPoint(this Vector2 v)
    {
        return new Point((int)v.X, (int)v.Y);
    }
}

然后:

HandleCollision(position.AsXNAPoint());

或者可能:

HandleCollision(position.Floor().AsXNAPoint());
于 2012-09-14T06:35:35.973 回答