2011-09-01 5 views
1

다음 규칙에 따라 미사일을 따라오고 싶습니다.
- 플레이어가 미사일에 비해 오른쪽에있을 때 고정 된 위치에서 오른쪽으로 회전을 변경하십시오 속도
- 내가 선수로 점프 할 때 다른 사람이 같은 비율이 코드
미사일 시스템 수학 문제 (극소수의 코드)

  if (missile.Rotation > 0 && missile.Rotation < Math.PI) 
      { 
       if (angle > missile.Rotation && angle < missile.Rotation + Math.PI) 
       { 
        missile.Rotation += 0.05f; 
       } 
       else 
       { 
        missile.Rotation -= 0.05f; 
       } 
      } 
      else 
      { 
       if (angle < missile.Rotation && angle > missile.Rotation - Math.PI) 
       { 
        missile.Rotation -= 0.05f; 
       } 
       else 
       { 
        missile.Rotation += 0.05f; 
       } 
      } 
      missile.Position += new Vector2((float)(5 * gameTime.ElapsedGameTime.TotalSeconds * Math.Cos(missile.Rotation)), (float)(5 * gameTime.ElapsedGameTime.TotalSeconds * Math.Sin(missile.Rotation))); 

에서 왼쪽으로 회전을 변경, 일부 미사일이 버그가 보인다, 미사일이 될 수없는 무한 루프로 이동 멈췄다 (그들은 원으로 날다)

좌표계가 XNA와 비슷합니다 (360/0 °는 오른쪽, 270 °는 상단 ... ...)

누구든지 나를 도울 수 있습니까?

+1

그리고 내가 진짜 미사일에 대해 알았는데 .. –

+0

각도 = 각도 미사일에서 플레이어 – Blaxx

+1

@Bojan K에 :되지 않은이겠습니까 [Ada] 태그 대신 [C#]? :) ...질문에 관해서는 MathHelper.Lerp() 또는 이와 유사한 메서드를 사용하지 않는 특별한 이유가 있습니까? –

답변

7

오일러 각도를 사용하는 것은 매우 비효율적 인 방법입니다. 벡터를 사용하는 것이 훨씬 쉽습니다.

P를 플레이어의 위치로, M을 미사일의 위치라고합시다. MP와 Mr 여기서 MP = 미사일에서 플레이어까지의 벡터와 Mr은 미사일의 오른편을 가리키는 벡터입니다. 이제 MP와 Mr. 벡터 사이의 내적을 계산하십시오. 결과의 부호는 미사일을 돌리는 방법을 알려줍니다. 양성이라면 미사일을 시계 방향으로 돌리고 음수라면 미사일을 시계 반대 방향으로 돌립니다.

왜이 기능이 작동합니까? 또한

Ax.Bx + Ay.By 

하고 :

두 벡터 A 및 B의 내적은 다음과 같이 쓸 수

세타는 두 벡터의 사이 각이다
|A|.|B|.cos (theta) 

| X | 벡터 x의 크기입니다. 이것은 우리를 제공합니다

cos (theta) = (Ax.Bx + Ay.By)/(|A|.|B|) 

우리는 값의 코사인 (세타) + 사이의 각도 인 양의 값의 부호 알고 싶어하기 때문에 - 90 개도 90과 270도 사이의 각도, 우리는 만하면되는 음의 값을 분자의 부호를 알아 내려면 분모는 항상 양수입니다! 따라서 내적 제품의 표시는 어느 쪽이 표적에 있는지 알려줄 것입니다.

하지만 생각보다 벡터가 각도보다 사용하기가 어렵지 않습니까? 미사일의 오른쪽 벡터를 계산하기 위해 삼각 함수를 할 필요가 없습니까?

이상적으로는 오일러 각을 전혀 사용하지 않아야합니다. 당신은 당신의 세계에있는 물체의 위치와 회전을 저장하기 위해 행렬을 사용해야합니다. 미사일의 오른쪽 벡터는 미사일의 위치/방향 행렬의 첫 행에 불과합니다 (또는 첫 번째 열은 시스템 설정 방법에 따라 다릅니다). 행렬은 객체를 그리는 데 렌더링 하드웨어가 사용하는 객체이므로 객체를 사용하여 오버 헤드를 추가하지 않습니다 (실제로 각도를 사용하면 렌더링을위한 각도 표기법을 행렬로 변환해야하므로 오버 헤드가 추가됩니다).

편집 : 당신 코드는 다음처럼 보이는 결국해야합니다

if (VectorDotProduct (missile.right, player.pos - missil.pos) > 0) 
{ 
    missile.rotate clockwise 
} 
else 
{ 
    missile.rotate anti-clockwise 
} 
+2

추가 : XNA는 매우 간단한 벡터 및 행렬 조작 방법 세트를 제공합니다. –

+0

이것은 무엇을 찾고 있었는지, 고마워요. – Blaxx