2012-05-05 6 views
2

벡터 2 (XNA의 라이브러리에서) float 아니요 int?Vector2가 (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의를 사용 않습니다.) 당신이 스칼라와 함께 작업 할 때

3

거기에 와 같은 것이 "반 화소." 픽셀 정렬되지 않은 부동 좌표를 사용하면 스프라이트가 하위 픽셀 좌표로 렌더링됩니다. 이것은 종종 객체가 부드럽게 스크롤되도록하는 데 필요하지만 일부 상황에서는 불쾌한 반짝이는 효과를 유발할 수도 있습니다.

은 기본 개념에 대한 요약 여기를 참조하십시오 : Subpixel rendering

+0

그래서 개체의 크기 (__float__)와 화면 좌표 (__float__)를 기억하기 위해 어떤 구조를 사용해야합니까? ** 직사각형 **은 완벽하지만 __int__을 사용합니다. 내가 찾고있는 __float__ ** Rectangle ** 내 자신의 구조를 만들지 않고도 (내가 무엇을 의미하는지 안다면 바퀴를 재발 명하고 싶지는 않다.)). –

+0

내 2D 게임에서 Niko Drašković가 자신의 대답에서 설명한대로 일반적으로 위치에 Vector2를 사용하고 경계선에 Rectangle을 사용합니다. –

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 속성을 설정 객체를 이동합니다. 이 값이 Position에 직접적으로 의존의로

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

당신은 사각형에 대해 걱정할 필요가 없습니다.

내 게임 객체

또한 일반적으로 단지 충돌

또한 부를 수
//_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를 사용할 수 귀하의 Game.Update()

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

충돌 감지 코드로 자신을 그리는 방법을 포함 spriteBatch.Draw()PositionRectangle으로 설정하면 많은 차이를 느끼지 않을 것입니다.