为什么我的方向对我的标准化向量如此不准确?

时间:2016-11-27 02:14:10

标签: java vector 2d game-physics

我正在设计一款游戏并且已经让它运行得很好。我的一个问题是,我目前将精灵从一个点移动到另一个点的方法效果很好......但方向有点不准确。如果精灵没有"按下"那就不会那么糟糕。在它的路径尽头到位。

是否有人可以提出任何建议 a)帮助提高我的指导的准确性 b)帮助精灵更轻柔地到位

这是我计算从A点到B点的移动的代码:

if (!mMoving) {
        mMoving = true;
        mVecStart = new Vec(mPos.getX(),mPos.getY());
        mVecEnd = new Vec(target.getX(), target.getY());

        mDistanceToDestination = Vec.distanceBetween(mVecEnd, mVecStart);

        mDirection = mVecStart.directionTo(mVecEnd, mDistanceToDestination);

        mVelocityX = mDirection.mDX * mSpeed;
        mVelocityY = mDirection.mDY * mSpeed;
    }


    if (mMoving == true) {
        // Move along the x and y axis at given velocity, scaled by deltaTime.
        this.mPos.x += mVelocityX * deltaTime;
        this.mPos.y += mVelocityY * deltaTime;

        // If the distance traveled exceeds the original distance computed, snap the sprite
        // into place immediately.
        if (mMoving && Vec.distanceBetween(mVecStart, new Vec(this.mPos.x, this.mPos.y))
                >= mDistanceToDestination) {
            this.mPos.x = (int) target.getX();
            this.mPos.y = (int) target.getY();
            mMoving = false;
            mMoveComplete = true;
        }
    }

以下是计算方向的方法:

public Vec directionTo(Vec vecEnd, double distance) {

    return new Vec((vecEnd.mDX - this.mDX) / distance,
            ((vecEnd.mDY - this.mDY) / distance));
}

1 个答案:

答案 0 :(得分:1)

您可以通过将每个分量除以其大小来计算给定矢量的单位矢量。

这里是我如何计算直角坐标系中平面矢量的大小:

string code = content.Split(new[] { "/" }, StringSplitOptions.None).Last();

您应该学习如何使用Junit来测试您的课程。您将在调试器中花费更少的时间或者忽视缺陷:

package vector;

import java.awt.geom.Point2D;

/**
 * Created by Michael
 * Creation date 11/26/2016.
 * @link
 */
public class VectorUtils {

    public static double magnitude(Point2D beg, Point2D end) {
        double magnitude = 0.0;
        if ((beg != null) && (end != null)) {
            double dx = Math.abs(end.getX()-beg.getX());
            double dy = Math.abs(end.getY()-beg.getY());
            if ((dx == 0.0) && (dy == 0.0)) {
                magnitude = 0.0;
            } else {
                if (dx > dy) {
                    double r = dy/dx;
                    magnitude = dx*Math.sqrt(1.0+r*r);
                } else {
                    double r = dx/dy;
                    magnitude = dy*Math.sqrt(1.0+r*r);
                }
            }
        }
        return magnitude;
    }
}