카테고리 보관물: 게임개발

게임개발

개체를 한 방향으로 움직이게하려면 어떻게합니까? 봅시다. 엔티티를 그 방향으로 이동시키는 함수에

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 * 1x 방향 및 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 (각도)

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


답변