这是您将看到的一些方法的简要说明:


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/

10-09 05:24