我正在开发一款能够在二维空间中利用精灵的游戏,而我正试图想出一个更好的方法来停留在一个确切的位置。
我已经完成了以下工作:
public void target(boolean hasTargetIn, Point target) {
if (hasTarget) {
deltaX = target.getX() - this.mPos.getX();
deltaY = target.getY() - this.mPos.getY();
mDirection = Math.atan2(deltaY,deltaX);
mVelocityX = Math.cos(mDirection) * mSpeed;
mVelocityY = Math.sin(mDirection) * mSpeed;
}
hasTarget = hasTargetIn;
}
public void move(Point target) {
if (mPos.getX() != target.getX() + 3 && mPos.getY() != target.getY() + 3) {
this.mPos.x += mVelocityX;
this.mPos.y += mVelocityY;
}
}
以下是我给该方法的论据:
sprite.target(true, new Point(700,305));
sprite.move(new Point(700,305));
但这需要我在move()方法中将target.getX()偏移3,因为当精灵到达位置时X值在703和697之间摇摆(因此它只是在没有逻辑I'的情况下保持抖动) ve包含在move()方法中)。是否有更好的方法可以在一个确切的位置移动和停止?
答案 0 :(得分:1)
只需使用距目标的距离。如果距离大于正常移动的速度,如果距离小于速度,则只需移动距离。
您不需要使用atan2
,sin
和cos
来获取规范化的deltaX,Y您可以将增量除以距离。与获取方向和使用sin和cos一样。
deltaX = target.getX() - this.mPos.getX();
deltaY = target.getY() - this.mPos.getY();
// get the distance
mDist = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
if(mDist > 0){
if(mDist < mSpeed){
mVelocityX = deltaX;
mVelocityY = deltaY;
}else{
mVelocityX = (deltaX / mDist) * mSpeed;
mVelocityY = (deltaY / mDist) * mSpeed;
}
}else{
mVelocityX = 0;
mVelocityY = 0;
}
答案 1 :(得分:0)
你保存方向。你不能简单地在方向移动大约(!)180度后停止移动吗?
另一方面,可能会发生你的速度太快(在其他情况下),所以你不会超过3但可能是300像素,所以当你认识到(通过方向)你跑过了目标,当你以低速再次通过目标时,你以较小的速度回转并停止(如前所述)。