2012-05-05 3 views
2

なぜベクター2(XNAのライブラリから)floatintVector2(XNAのライブラリから)がintではなくfloatを使用するのはなぜですか?

カーソル位置は、int egersで定義できるように、コンピュータ画面上の位置はピクセルで与えられます。 半画素のようなものはありません。なぜ我々は浮動小数点を使用するのですか?

SpriteBatchクラス私は、Drawという7つのオーバーロードされたメソッドを見つけました。そのうちの2:

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

だから我々はは両方int型フロート座標を受け入れる描くことがわかります。

ゲームのオブジェクトの画面座標を実装しているときにこの問題が発生しました。 長方形はオブジェクトのサイズと画面座標を保持するのに適していると仮定しました。しかし、今私は確信していません...

+0

は、常に小数を使用しています。または速度が0.1fで、それをintに追加し続けると、位置は変わりません。しかし、浮動小数点数を使用すると、ポジションが増加し続けることになります。 –

+0

@patryk - Vector2は、単にピクセル位置をスクリーンするだけでなく、他の多くのものに使用されます。他の用途のほとんどは、整数より細かい精度が望まれる算術演算を含む。 –

答えて

5

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

(お知らせもXNA構造体Pointは、実際にint Sを使用しないこと。)あなたはスカラーで作業しているとき

3

そこに "ハーフピクセル"のようなものです。ピクセルで整列されていない浮動小数点座標を使用すると、スプライトがサブピクセル座標にレンダリングされます。これは、オブジェクトをスムーズにスクロールするように見せるためにはしばしば必要ですが、場合によっては不快なキラキラとした効果をもたらすこともあります。

は、基本的な考え方の概要については、こちらを参照してください:Subpixel rendering

+0

オブジェクトのサイズ(__float__内)と画面座標(__float__)を記憶するためには、どのような構造を使用するべきですか。 ** Rectangle **は完璧ですが、__int__を使用します。私は__float__ ** Rectangle **を探しています。私自身の構造を作らずに同等です(私が何を意味しているか知っていれば、ホイールを再構成したくありません))。 –

+0

私の2Dゲームでは、一般的にVector2を位置に使用し、Rectangleをバウンディングに使用しています。NikoDraškovićが答えて説明しました。 –

4

あなたのオブジェクトの座標を表すためにVector2Rectangleの両方を使用することができます。ちょうど新しい値にそのPositionプロパティを設定し、オブジェクトを移動するには

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; 
    } 
} 

:私は通常、このようにそれを行います。

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

あなたはそれの価値がPositionに直接依存して、長方形を心配する必要はありません。

マイゲームオブジェクトはまた、通常、あなたのGame.Update()で、このような

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

衝突検出コードとして自分自身を描画する方法は、ちょうど衝突あなたも呼び出すことができます

//_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; 
} 

をテストするためにPositionRectangleを使用することができます含まれていますspriteBatch.Draw()PositionRectangleとすると、大きな違いはありません。

関連する問題