如何使实体向某个方向移动?


11

我有一个Entity实例,每个游戏滴答声都会更新。让我们假设实体不断前进。我希望能够将实体的角度赋予使其朝该方向移动的功能:

moveForward(90);应该使它们向右移动。如果我宣布轮换为global int,那么

moveForward(rotation);
rotation++;

会使它的运动跟踪一个小圆圈。

我怎样才能做到这一点?我认为这涉及向量数学。我什么都不知道,所以简短的解释会很好。

Answers:


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 * 1在X方向和speed * cos(90)0 y方向(如指定应该向右移动)。那应该使您从基本的意义上入手。

使其通用:

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

啊,那比我想象的要简单得多,非常感谢:)
肖恩·怀尔德

我很确定您需要切换y和x。sinα= b / c。
jcora 2012年

@Bane匹配我制作的SOH-CAH-TOA的图形,罪过在斜边上是相反的,在图中斜边是x /速度。如果该角度位于三角形的另一侧,则该角度将被反转(如果出于游戏设计的目的更实际,我可以对其进行更改,但我觉得它是任意的)。
凯文·迪特里亚

我在用手机,所以很难解释。我只是浏览了公式...
jcora 2012年

那是一个非常不错的三角形。+1
凯文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沿旋转方向向前移动。

编辑:tesselode做同样的事情,除了他没有左右移动。


2

您说的是更新时间,所以我假设您的帧率没有变化。如果是这样的话:

x + =速度* math.cos(角度)

y + =速度* math.sin(角度)

如果您使用可变帧频,则还需要乘以增量时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.