2012-03-01 5 views
0

그래서 나는 만들고있는 게임을 가지고 있고 걸려 넘어갔습니다. 나는 두 개의 스프라이트를 가지고 있는데 A와 B라고 부른다. 지금까지 A가 B를 추적했다. B의 위치를 ​​얻고 X 좌표가 A의 X 좌표보다 크다면 A의 속도를 X 위치에 더한다. X 위치와 A 위치 및 Y 위치에 대해 반복합니다. 나는 또한 그것을 구형으로 저장하고 간단한 삼각법을 사용하여 회전을 설정함으로써 A가 가리키는 것을 가지고있다. 그러나 이제는 다른 모든 작업을 할 수있게되었으므로 조금 더 현실감있게 만들고 싶습니다. B가 A의 왼쪽 지점에서 A의 오른쪽 지점으로 빠르게 이동하면 A의 각도와 이동이 아래에서 왼쪽으로 가리키고 이동하는 것에서 급속하게 이동합니다. 부드럽게 움직여야합니다. A가 각도 (예 : Update() 호출 당 5도 정도)를 바꿀 수있는 속도를 늦추려는 생각 이었지만 문제가 해결되지 않을 뿐이므로 조금만 움직여야합니다. 이 질문이 길고 많은 답을 얻지 못할 수도 있지만, 여러분이 말할 수있는 것이 무엇이든 많이 도움이 될 것입니다. 감사!XNA 무브먼트 물리학 및 트래킹

답변

2

나는 predator-prey system을 만들 것이라고 생각합니다. 이들은 일반적으로 미분 방정식으로 모델링되지만 간단한 시뮬레이션 알고리즘은 here입니다.

0

나는 Lerping (linearly interpolating) A의 시간의 경과에 따른 추적을 즉각적으로 추천하지 않을 것이다. 실제로 직면하는 위치 인 A에 Vector2를 저장하고 각각의 프레임에 대해 하드 코딩 된 각도 또는 일정 비율의 비율로 B에 해당 위치를 유행시킵니다.

원하는 위치로 현재 위치를 lerping하는 샘플 코드가 있습니다. 위의 예에서

Vector3 current = Vector3.Zero; 
Vector3 desired = new Vector3(10, 0, -5); 

// For this example we will lerp 75% of the way from 'current' to 'desired' per second 
Vector3 LerpTowardDesired(Vector3 current, Vector3 desired, float timeDelta) 
{ 
    float lerpPercentage = timeDelta * 0.75f; 
    Vector3 newPos = Vector3.Zero; 
    newPos.x = MathHelper.Lerp(current.x, desired.x, lerpPercentage); 
    newPos.y = MathHelper.Lerp(current.y, desired.y, lerpPercentage); 
    newPos.z = MathHelper.Lerp(current.z, desired.z, lerpPercentage); 
} 

당신은 단순히 timeDelta로 초 경과 시간을 전달, 프레임 당 한 번 LerpTowardDesired을 부를 것이다. 알림 timeDelta은 float이므로 전달되는 초는 초를 포함합니다 (예 : 0.016은 1/60 초를 나타냅니다. 따라서 가장 가까운 초로 올림하고 0을 전달하지 않음).

위에서 정의한 currentdesired 벡터를 사용하면 완벽한 60fps (초당 프레임 수)를 가정 할 때 몇 프레임의 결과가됩니다.

// After frame 1 
current = LerpTowardDesired(current, desired, 0.016f); 
// current is now (0.12f, 0.0f, -0.06f) 

// After frame 2 
current = LerpTowardDesired(current, desired, 0.016f); 
// current is now (0.239f, 0.0f, -0.119f) 

// After frame 3 
current = LerpTowardDesired(current, desired, 0.016f); 
// current is now (0.356f, 0.0f, -0.178f) 

당신이 current 위치가 desired 위치를 향해 이동하기 시작했다 이상 3 프레임을 볼 수 있듯이. 스프 라이트를 항상 current 위치로 향하게하면 즉시 스프레이 대신 대상 스프라이트를 추적해야합니다.

프레임 당 하드 코드 된 각도가 아니라 백분율을 사용하는 것이 가장 좋은 점은 대상이 더 빨리 움직일수록 더 빠른 속도의 Lerping이 발생한다는 것입니다. 거리. 즉, A은 아무리 빠르더라도 항상 B을 따라 잡을 것입니다.