개체를 한 방향으로 움직이게하려면 어떻게합니까?


11

Entity모든 게임 틱마다 업데이트 되는 인스턴스가 있습니다. 엔터티가 지속적으로 발전한다고 가정 해 봅시다. 엔티티를 그 방향으로 이동시키는 함수에 각도를 부여하고 싶습니다.

moveForward(90);그들이 오른쪽으로 움직여야합니다. 나는 세계로 내 회전을 선언하는 경우 int, 다음 일을

moveForward(rotation);
rotation++;

움직임이있는 작은 원을 추적하게됩니다.

어떻게해야합니까? 나는 이것이 벡터 수학과 관련이 있다고 가정한다. 나는 모른다. 그래서 간단한 설명이 좋을 것이다.

답변:


16

가장 간단한 의미에서 당신은 이와 같은 것을 가지고 있습니다.

   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 * 1x 방향 및 speed * cos(90)또는 0은 y 방향 (사용자가 지정한 것처럼 오른쪽으로 이동해야합니다). 기본적인 의미에서 시작해야합니다.

일반화 :

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}

Ahh, 그것은 내가 생각했던 것보다 훨씬 간단합니다. 고마워요 :)
Shaun Wild

나는 당신이 y와 x를 전환해야한다고 확신합니다. sinα = b / c.
jcora

@ 베인 그것은 내가 SOH-CAH-TOA를 만든 그림과 일치합니다. 죄는 그림에서 x / 속도 인 빗변과 반대입니다. 각도가 삼각형의 반대편에 있다면 반전됩니다 (그리고 게임 디자인의 목적에 더 실용적이라면 변경할 수는 있지만 모든 것을 임의적으로 느낍니다).
Kevin DiTraglia

저는 휴대 전화를 사용하고있어서 해석하기가 매우 어렵습니다. 나는 방금 공식을 훑어
보았습니다

정말 멋진 삼각형입니다. +1
Bro Kevin D.

3

다른 대답은 현재 잘못된 것입니다. 회전에 따라 평면을 따라 올바르게 이동하려면 다음을 수행하십시오.

posX += Math.cos(rotation) *  forwardSpeed + Math.sin(rotation) * strafeSpeed;
posY -= -Math.cos(rotation) * strafeSpeed + Math.sin(rotation) * forwardSpeed;

그러나 회전이 변경 될 때만 업데이트되도록 cos / sin에 변수를 만드는 것이 좋습니다. 그래서 4 번 틱을 계산하지 않습니다.

strafeSpeed는 좌우로 움직이고, 앞으로 회전 할 때는 forwardSpeed입니다.

편집 : 테셀로드는 옆으로 움직이지 않는다는 점을 제외하고는 같은 일을합니다.


2

업데이트 틱을 말 했으므로 가변 프레임 속도가 없다고 가정합니다. 그렇다면:

x + = 속도 * math.cos (angle)

y + = 속도 * math.sin (각도)

가변 프레임 속도를 사용하는 경우 델타 시간도 곱해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.