그런 식으로 연산을 설명하는 것이 더 쉽기 때문에 선형 대수 구조를 사용하겠습니다. 이 벡터 연산을 구현하는 방법을 모른다면 마지막에 간단한 설명을 드리겠습니다.
그럼이 값으로 시작 가정 해 봅시다 : start
및 end
운동의 끝 지점을 표시, speed
이 두 번째로 이동해야합니다 얼마나 많은 픽셀이며, elapsed
당신이 당신의 객체의 위치 (일부 엔진이 이미 당신을 위해 가치를 제공을 업데이 트됩니다되는 속도입니다 ) :
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
가장 먼저 계산하고자하는 것은 두 점 사이의 거리와 시작부터 끝까지의 방향을 포함하는 정규화 된 벡터입니다. 또한 객체 위치를 start
점에 "스냅"해야 합니다. 이 단계는 처음에 한 번만 수행됩니다.
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
그런 다음 업데이트 방법에, 당신의 곱셈을 추가하여 개체를 이동 direction
, speed
그리고 elapsed
그 위치로. 그런 다음 이동이 끝났는지 확인하기 위해 시작점과 객체의 현재 위치 사이의 거리가 계산 한 초기 거리 보다 큰지 확인합니다. 그것이 사실이라면, 우리는 객체의 위치를 끝점으로 스냅하고 객체 이동을 중단합니다 :
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
빠른 벡터 연산 참조
대표
Vector2 A = float aX, aY;
합계 / 빼기
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
스칼라 곱하기 (float)
A*float = a.x*float; a.y*float;
길이 / 거리
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
정규화
normalize(A) = a.X/length(A); a.Y/length(A);
Vector
사용 가능한 클래스 가 없으면 위의 코드를 일반 작업으로 변환하기에 충분해야 합니다.
변환의 예
// Your Variables
float startX, startY, endX, endY;
float speed = 100;
float elapsed = 0.01f;
// On starting movement
float distance = Math.sqrt(Math.pow(endX-startX,2)+Math.pow(endY-startY,2));
float directionX = (endX-startX) / distance;
float directionY = (endY-startY) / distance;
object.X = startX;
object.Y = startY;
moving = true;
// On update
if(moving == true)
{
object.X += directionX * speed * elapsed;
object.Y += directionY * speed * elapsed;
if(Math.sqrt(Math.pow(object.X-startX,2)+Math.pow(object.Y-startY,2)) >= distance)
{
object.X = endX;
object.Y = endY;
moving = false;
}
}