这里简要介绍了您会看到的一些方法:
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)。而且,它只是真的&#34;漂移&#34;当它变得非常慢时,在目标的方向上。
关于如何实现这一目标的任何想法?我无法弄明白。这是一个很大的问题,非常感谢。
这是使用我制作的大型图书馆,如果您对某些内容有什么问题请问,我想我已经覆盖了大部分内容。
答案 0 :(得分: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)
因此,对于每个时间间隔添加所有力,找到结果加速度,找到结果速度,相应地改变位置