我有一个Entity
实例,每个游戏滴答声都会更新。让我们假设实体不断前进。我希望能够将实体的角度赋予使其朝该方向移动的功能:
moveForward(90);
应该使它们向右移动。如果我宣布轮换为global int
,那么
moveForward(rotation);
rotation++;
会使它的运动跟踪一个小圆圈。
我怎样才能做到这一点?我认为这涉及向量数学。我什么都不知道,所以简短的解释会很好。
我有一个Entity
实例,每个游戏滴答声都会更新。让我们假设实体不断前进。我希望能够将实体的角度赋予使其朝该方向移动的功能:
moveForward(90);
应该使它们向右移动。如果我宣布轮换为global int
,那么
moveForward(rotation);
rotation++;
会使它的运动跟踪一个小圆圈。
我怎样才能做到这一点?我认为这涉及向量数学。我什么都不知道,所以简短的解释会很好。
Answers:
从最简单的意义上讲,您有类似这样的东西。
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沿旋转方向向前移动。
编辑:tesselode做同样的事情,除了他没有左右移动。