4

Vector2 (XNA のライブラリから) がintではなくfloatを使用するのはなぜですか?

コンピュータ画面上の位置はピクセル単位で与えられるため、カーソル位置は 2 つの整数で定義できます。半画素なんてものはありません。では、なぜフロートを使用するのでしょうか。

SpriteBatchクラスで、 Draw と呼ばれる 7 つのオーバーロードされたメソッドを見つけまし。それらの2つ:

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

したがって、 Drawはint座標とfloat座標の両方を受け入れることがわかります。

ゲームのオブジェクトの画面座標を実装しているときに、この問題に遭遇しました。オブジェクトのサイズと画面座標を保持するには、 Rectangleが適切な選択であると想定しました。しかし、今はよくわかりません...

4

3 に答える 3

6

数学的には、ベクトルは動きであり、位置ではありません。画面上の位置は技術的には整数の間にはできないかもしれませんが、動きは間違いなく可能です。ベクトルがints を使用した場合、移動できる最も遅い速度は になります(1, 1)。s を使用すると、 、 などfloatを移動できます。(.1, .1)(.001, .001)

(XNA 構造体Pointが実際にints を使用していることにも注意してください。)

于 2012-05-06T01:55:08.710 に答える
4

との両方Vector2を使用Rectangleして、オブジェクトの座標を表すことができます。私は通常、次のようにします。

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 に答える