4

为什么Vector2(来自 XNA 的库)使用float而不是int

计算机屏幕上的位置以像素为单位,因此光标位置可以由两个整数定义。没有半个像素这样的东西。那我们为什么要使用浮点数呢?

SpriteBatch类中,我发现了 7 个称为Draw的重载方法。他们两个人:

public void Draw(Texture2D texture, Rectangle destinationRectangle, Color color);
public void Draw(Texture2D texture, Vector2 position, Color color);

所以我们可以看到Draw接受intfloat坐标。

我在实现游戏对象的屏幕坐标时遇到了这个问题。我认为Rectangle是保存对象大小和屏幕坐标的不错选择。但现在我不确定...

4

3 回答 3

6

在数学上,向量是运动,而不是位置。虽然屏幕上的位置在技术上可能无法介于整数之间,但运动绝对可以。如果一个向量使用ints 那么你可以移动的最慢的将是(1, 1)。使用floats 你可以移动(.1, .1), (.001, .001), 等等。

(另请注意,XNA 结构Point确实使用ints。)

于 2012-05-06T01:55:08.710 回答
4

您可以同时使用Vector2Rectangle来表示您的对象坐标。我通常这样做:

public class GameObject
{
    Texture2D _texture;

    public Vector2 Position { get; set; }
    public int Width { get; private set; } //doesn't have to be private
    public int Height { get; private set; } //but it's nicer when it doesn't change :)

    public Rectangle PositionRectangle
    {
        get
        {
            return new Rectangle((int)Position.X, (int)Position.Y, Width, Height);
        }
    }

    public GameObject(Texture2D texture)
    {
        this._texture = texture;
        this.Width = texture.Width;
        this.Height = texture.Height;
    }
}

要移动对象,只需将其Position属性设置为新值。

_player.Position = new Vector2(_player.Position.X, 100);

您不必担心矩形,因为它的值直接取决于Position.

我的游戏对象通常也包含绘制自己的方法,例如

public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
{
    spriteBatch.Draw(this._texture, this.Position, Color.White);
}

您的碰撞检测代码Game.Update()可以只使用PositionRectangle来测试碰撞

//_player and _enemy are of type GameObject (or one that inherits it)
if(_player.PositionRectangle.Intersects(_enemy.PositionRectangle))
{
    _player.Lives--;
    _player.InvurnerabilityPeriod = 2000;
    //or something along these lines;
}

您也可以调用spriteBatch.Draw()with PositionRectangle,您应该不会注意到太大的区别。

于 2012-05-05T19:42:26.033 回答
3

有“半个像素”这样的东西使用非像素对齐的浮点坐标将导致您的精灵在子像素坐标处呈现。这通常是使对象看起来平滑滚动所必需的,但在某些情况下也会产生令人不快的闪烁效果。

有关基本思想的摘要,请参见此处:亚像素渲染

于 2012-05-05T10:04:23.843 回答