그래서 나는 만들고있는 게임을 가지고 있고 걸려 넘어갔습니다. 나는 두 개의 스프라이트를 가지고 있는데 A와 B라고 부른다. 지금까지 A가 B를 추적했다. B의 위치를 얻고 X 좌표가 A의 X 좌표보다 크다면 A의 속도를 X 위치에 더한다. X 위치와 A 위치 및 Y 위치에 대해 반복합니다. 나는 또한 그것을 구형으로 저장하고 간단한 삼각법을 사용하여 회전을 설정함으로써 A가 가리키는 것을 가지고있다. 그러나 이제는 다른 모든 작업을 할 수있게되었으므로 조금 더 현실감있게 만들고 싶습니다. B가 A의 왼쪽 지점에서 A의 오른쪽 지점으로 빠르게 이동하면 A의 각도와 이동이 아래에서 왼쪽으로 가리키고 이동하는 것에서 급속하게 이동합니다. 부드럽게 움직여야합니다. A가 각도 (예 : Update() 호출 당 5도 정도)를 바꿀 수있는 속도를 늦추려는 생각 이었지만 문제가 해결되지 않을 뿐이므로 조금만 움직여야합니다. 이 질문이 길고 많은 답을 얻지 못할 수도 있지만, 여러분이 말할 수있는 것이 무엇이든 많이 도움이 될 것입니다. 감사!XNA 무브먼트 물리학 및 트래킹
0
A
답변
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을 전달하지 않음).
위에서 정의한 current
및 desired
벡터를 사용하면 완벽한 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
을 따라 잡을 것입니다.
관련 문제
- 1. 간단한 XNA 2d 물리학 라이브러리
- 2. XNA 2D 캐릭터 이동 - 픽셀 당 물리학
- 3. 우주선 무브먼트
- 4. IPv6 및 트래픽 트래킹
- 5. 게임에서의 벡터 및 물리학
- 6. 2d의 자바 무브먼트
- 7. ActiveRecord의 HABTM 관계 트래킹
- 8. 파이썬으로 ftp 폴더 트래킹
- 9. 무료 버전 관리 및 이슈 트래킹 시스템
- 10. jQuery를 통한 트래킹
- 11. KnockoutJS : 트래킹 메뉴 클릭
- 12. Box2D 및 플랫폼과 관련된 음향 물리학
- 13. 하스켈 물리학 하스켈
- 14. jquery 양식의 일부분을 트래킹
- 15. 트래킹/상태를위한 디자인 패턴
- 16. 트래킹 수취 거래
- 17. 트래킹 마우스 움직임
- 18. 이슈 트래킹 위젯 제안
- 19. Python에서 JSON 트래킹
- 20. 슬레이브 래그 트래킹
- 21. 아이폰을위한 아이 트래킹?
- 22. 순서대로 해시 트래킹
- 23. C# - 자외선 측정 코드 설명 (물리학)
- 24. 파르시 물리학 ... 안녕하세요 세계 ...?
- 25. 물리학 시뮬레이션 시작
- 26. XNA 및 .NET Framework
- 27. .NET 의존성 및 XNA
- 28. XNA 및 WinForms
- 29. XNA 및 RenderTargets
- 30. XNA 및 파일에서 이미지로드