Entity
모든 게임 틱마다 업데이트 되는 인스턴스가 있습니다. 엔터티가 지속적으로 발전한다고 가정 해 봅시다. 엔티티를 그 방향으로 이동시키는 함수에 각도를 부여하고 싶습니다.
moveForward(90);
그들이 오른쪽으로 움직여야합니다. 나는 세계로 내 회전을 선언하는 경우 int
, 다음 일을
moveForward(rotation);
rotation++;
움직임이있는 작은 원을 추적하게됩니다.
어떻게해야합니까? 나는 이것이 벡터 수학과 관련이 있다고 가정한다. 나는 모른다. 그래서 간단한 설명이 좋을 것이다.
답변
가장 간단한 의미에서 당신은 이와 같은 것을 가지고 있습니다.
y |\
| \
m | \ s
o | \ p
v |(a) \ e
(y)e |angle\ e
m | \ d
e | \
n | \
t | \
|__________\
x movement
(x)
그러나 속도는 적의 속도가 빠르며, 각도의 죄값을 취하고 속도를 곱하여 x 방향으로 얼마나 움직여야하고 y 방향으로 얼마나 많이 움직여야하는지 결정할 수 있습니다. 때문에…
sin(a) = x / speed
그래서:
x = speed * sin(a)
과:
cos(a) = y / speed
그래서:
y = speed * cos(a)
당신의 예에서 moveForward(90)
얻을 것 speed * sin(90)
또는 speed * 1
x 방향 및 speed * cos(90)
또는 0
은 y 방향 (사용자가 지정한 것처럼 오른쪽으로 이동해야합니다). 기본적인 의미에서 시작해야합니다.
일반화 :
moveForward(float angle)
{
x += speed * sin(angle);
y += speed * cos(angle);
}
답변
다른 대답은 현재 잘못된 것입니다. 회전에 따라 평면을 따라 올바르게 이동하려면 다음을 수행하십시오.
posX += Math.cos(rotation) * forwardSpeed + Math.sin(rotation) * strafeSpeed;
posY -= -Math.cos(rotation) * strafeSpeed + Math.sin(rotation) * forwardSpeed;
그러나 회전이 변경 될 때만 업데이트되도록 cos / sin에 변수를 만드는 것이 좋습니다. 그래서 4 번 틱을 계산하지 않습니다.
strafeSpeed는 좌우로 움직이고, 앞으로 회전 할 때는 forwardSpeed입니다.
편집 : 테셀로드는 옆으로 움직이지 않는다는 점을 제외하고는 같은 일을합니다.
답변
업데이트 틱을 말 했으므로 가변 프레임 속도가 없다고 가정합니다. 그렇다면:
x + = 속도 * math.cos (angle)
y + = 속도 * math.sin (각도)
가변 프레임 속도를 사용하는 경우 델타 시간도 곱해야합니다.