2012-10-03 4 views
0

나는 대학에서 내 게임 디자인 수업을 위해 C# xna에서 2D RPG 게임을 만들었습니다. 적을 플레이어쪽으로 이동시키는 간단한 AI를 만들려고합니다.XNA 벡터 수학 이동

/// <summary> 
    /// updates the enemy 
    /// </summary> 
    public void update() 
    { 
     this.Position = move(Game1.player.Position); 
    } 

하지만 적은 전혀 움직이지 않습니다 현재 내 코드는 대상이 업데이트 방법에 올바르게 전달 된 다음

/// <summary> 
    /// method to move the enemy 
    /// </summary> 
    /// <param name="target">the position of the target</param> 
    /// <returns>the new position to be moved to</returns> 
    public virtual Vector2 move(Vector2 target) 
    { 
     Vector2 temp = (target - Position); // gets the difference between the target and position 
     temp.Normalize();     // sets the vector to unit vector 
     temp *= moveSpeed;     // sets the vector to be the length of moveSpeed 
     float x = temp.X; 
     float y = temp.Y; 
     float xP, yP; 
     double angle = Math.Acos(((x * direction.X) + (y * direction.Y))/(temp.Length() * direction.Length())); //dot product finds the angle between temp and direction 
     angle *= agility;                      //gets the angle to move based on agility 
     xP = (float)(Math.Cos(angle) * (x - direction.X) - Math.Sin(angle) * (y - direction.Y) + x); 
     yP = (float)(Math.Sin(angle) * (x - direction.X) - Math.Cos(angle) * (y - direction.Y) + y);   // these lines rotate the point x,y around the direction vector by angle "angle" 
     return new Vector2(xP, yP); 
    } 

입니다. 민첩성 및 이동 속도가 0이 아니 었는지 확인하는 코드를 생성자에 추가했습니다. 이러한 값을 변경하면 아무 것도 수행되지 않습니다.

도움 주셔서 감사합니다. 코드에서

+0

왜'Dot' 방법을 사용하지? – phoog

+0

'Math.Atan2 ((PlayerPosition.Y - EnemyPosition.Y), (PlayerPosition.X - EnemyPosition.Y)))'를 사용할 수도 있습니다. 각도를 계산합니다. 나는 그것을 읽고 이해하기가 더 쉽다. –

답변

0

당신은 (방향의 각도에 대한 코드)이 반환 :

xP = (float)(Math.Cos(angle) * (x - direction.X) - Math.Sin(angle) * (y - direction.Y) + x); 
yP = (float)(Math.Sin(angle) * (x - direction.X) - Math.Cos(angle) * (y - direction.Y) + y);   // these lines rotate the point x,y around the direction vector by angle "angle" 

return new Vector2(xP, yP); 

하지만 당신은 이동이를 반환해야합니다

temp *= moveSpeed;     // sets the vector to be the length of moveSpeed  
float x = temp.X;  
float y = temp.Y; 
... 

return new Vector2(x, y);