这是您将看到的一些方法的简要说明:this.bounds
:返回船的边界(矩形)this.bounds.getCenter()
:返回表示船只边界中心的Vector2d
。getVelocity()
:代表船速的Vector2d
(添加到每帧的位置)new Vector2d(angle)
:当给定角度(以弧度为单位)时,归一化的新Vector2d
Vector2d#interpolate(Vector2d target, double amount)
:不是线性插值!如果要查看interpolate
代码,则为(在Vector2d
类中):
public Vector2d interpolate(Vector2d target, double amount) {
if (getDistanceSquared(target) < amount * amount)
return target;
return interpolate(getAngle(target), amount);
}
public Vector2d interpolate(double direction, double amount) {
return this.add(new Vector2d(direction).multiply(amount));
}
当玩家不按任何键时,飞船应减速。这是我要做的:
public void drift() {
setVelocity(getVelocity().interpolate(Vector2d.ZERO, this.deceleration));
}
但是,现在我意识到我希望它在向目标移动时漂移。我已经试过了:
public void drift(Vector2d target) {
double angle = this.bounds.getCenter().getAngle(target);
setVelocity(getVelocity().interpolate(new Vector2d(angle), this.deceleration));
}
当然,这实际上永远不会达到零速度(因为我正在向角度矢量(其大小为1)进行插值)。同样,当它变得非常慢时,它只会真正朝目标方向“漂移”。
关于如何实现此目标的任何想法?我只是想不通。这是一个大问题,非常感谢。
这是使用我制作的一个大型库,因此,如果您对某些内容有任何疑问,请询问,我想我已经涵盖了大部分内容。
最佳答案
您的interpolate
函数会做一些奇怪的事情。为什么不使用简单的物理模型?例如:
身体具有位置(px, py)
和速度(vx, vy)
,单位方向向量(dx, dy)
也很方便
在(小的)时间间隔之后,dt速度根据加速度而变化
vx = vx + ax * dt
vy = vy + ay * dt
任何外力(电动机)都会引起加速度并改变速度
ax = forcex / mass //mass might be 1
ay = forcey / mass
干摩擦力的大小不取决于速度,它的方向与速度相反
ax = c * mass * (-dx)
ay = c * mass * (-dy)
液体摩擦力的大小取决于速度(不同情况下有许多不同的方程式),其方向与速度相反
ax = k * Vmagnitude * (-dx)
ay = k * Vmagnitude * (-dy)
因此,对于每个时间间隔,添加所有力,找到产生的加速度,找到产生的速度,相应地改变位置
关于java - 方向移动时减速,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45993380/