如何一次沿一条线移动精灵一定数量的像素?

时间:2016-02-25 13:42:42

标签: java javafx

如果您在位置(100,100)处有一个精灵并且想要沿着一条线移动到位置(200,300),那么您如何以最多5像素的增量进行移动。目前,我只是使用x / y位置的差异来计算长度并一次移动精灵1/10的长度。

相反,我希望它最多移动5个像素。因此,对于这个例子,由于下一个y位置距离下一个x位置是2倍,它应该在y方向上进一步移动2x,以便精灵通过直线到达该位置。

当前代码:

public void move() {
    double currentX = this.getCenterX();
    double currentY = this.getCenterY();
    double nextX = next.getCenterX();
    double nextY = next.getCenterY();

    // Used to jump by 1/10 edge length
    double xDif = Math.abs(currentX - nextX);
    double yDif = Math.abs(currentY - nextY);

    // Move by 1/10 the length in correct direction
    if (currentX > nextX) {
        this.setX(this.getX() - (xDif/10));
    } else if (currentX < nextX) {
        this.setX(this.getX() + (xDif/10));
    }

    if (currentY > nextY) {
        this.setY(this.getY() - (yDif/10));
    } else if (currentY < nextY) {
        this.setY(this.getY() + (yDif/10));
    }
}

1 个答案:

答案 0 :(得分:1)

要获得运动矢量,首先需要获取方向向量以获得方向的单位向量(长度为1的向量)。

方向向量是起点和终点x1 - x0, y1 -y0之间的差值(差异)。

要获取单位向量,请将每个向量分量(x, y)除以向量总数sqrt(x^2 + y^2)

double xDirection = currentX - nextX;
double yDirection = currentY - nextY;
double magnitude = Math.sqrt(xDirection*xDirection + yDirection*yDirection);

double xUnit = xDirection/magnitude;
double yUnit = yDirection/magnitude;

现在,如果你想只移动5个像素,那么你可以通过将单位向量的每个分量乘以5来制作移动向量:

double xMovement = xUnit * 5;
double yMovement = yUnit * 5;

this.setX(this.getX() + xMovement);
this.setY(this.getY() + yMovement);