更好的方法停在准确的位置?

时间:2016-11-25 20:45:04

标签: java 2d game-physics

我正在开发一款能够在二维空间中利用精灵的游戏,而我正试图想出一个更好的方法来停留在一个确切的位置。

我已经完成了以下工作:

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()方法中)。是否有更好的方法可以在一个确切的位置移动和停止?

2 个答案:

答案 0 :(得分:1)

只需使用距目标的距离。如果距离大于正常移动的速度,如果距离小于速度,则只需移动距离。

您不需要使用atan2sincos来获取规范化的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像素,所以当你认识到(通过方向)你跑过了目标,当你以低速再次通过目标时,你以较小的速度回转并停止(如前所述)。