2012-05-05 5 views
2

I는 (내 XNA 게임 오브젝트에 나타내는 방향)와 같은 속성을 썼다 법선 벡터 동시에 각도에서 물체의 방향을 나타내고, 동일한 두 필드를 설정지정 및 메소드 호출 순서

public Vector2 Direction 
{ 
    get { return direction; } 
    protected set 
    { 
     (direction = value).Normalize(); // *** 
     angle = MathHelper.WrapAngle((float)Math.Atan(direction.X/direction.Y)); 
    } 
} 

세트.

***으로 표시된 줄이 실패하여 게임을 시작하지 못했습니다. 벡터를 정규화하지 않습니다.
나는이 라인을 변경 :

direction = value; 
direction.Normalize(); 

하고 그것을 잘 작동합니다 ... 왜?
*** 첫 번째 작업은 을 할당 한 다음 방향을 정규화한다고 가정했습니다. 그러나 사실이 아닙니다.

___ ___ _
___
정규화()는Vector2 클래스 방법이다.

// 
// Summary: 
//  Turns the current vector into a unit vector. The result is a vector one unit 
//  in length pointing in the same direction as the original vector. 
public void Normalize(); 
+1

언어에 대한 태그를 추가하십시오. – Mat

+1

던져지고있는 예외/게임 실패의 오류 메시지를 포함하십시오. – StellarEleven

+0

"게임 실패"란 게임 로직이 올바르게 업데이트되지 않았다는 의미입니다. –

답변

4

저는 Vector2가 구조체 또는 값 형식이라고 가정합니다. 이는 값으로 전달되며 참조로 전달되지 않음을 의미합니다. 방향에 값을 할당하면 값의 사본으로 방향이 설정됩니다. 또한 표현식 (direction = value)에 의해 반환 된 객체는 사본이며 방향에있는 동일한 인스턴스가 아닙니다. setter 블록 외부에 절대 저장되지 않는 객체에 대해 Normalize를 호출하고 있습니다.

같은 이유로 클래스의 속성 가져 오기 도구에서 반환 된 구조체에 대해 메서드를 호출하거나 속성을 설정할 수 없습니다. 예를 들어, 예제의 속성이 원숭이라는 클래스에있는 경우 다음을 참고하십시오. 참고 :

Monkey m = new Monkey(); 
m.Direction = new Vector2(...); 
m.Direction.X = 2; // This will not compile. 
m.Direction.Normalize(); // This will not do what you expect.