运动从一点到另一点对角移动精灵

时间:2014-10-22 20:34:14

标签: java geometry

所以我正在制作一个二十一点游戏,我已经写了一个渲染过程,它将一张卡片从卡片堆栈中移出并滑动到显示所有经销商卡片的地方。

我的方法很好,除了我要详述的一个问题:

每当Y坐标首先到达目标Y坐标时,精灵只会在X-asis上移动,因为它不能再移动Y,而不是与该点形成一个直角。

那么它将做的是对角向上移动然后立即向右移动(在我的情况下)

GIF:

IMG http://gyazo.com/bec6daadcb46bedc4777a3e4c5ff8c77.gif

MP4(在(..)菜单中选择mp4 http://gyazo.com/bec6daadcb46bedc4777a3e4c5ff8c77

正如你所看到的,它就是我刚才所说的。

我做错了什么?如何使其与目标成直角运动,而不是向上倾斜而不是立即转向?

我的流程代码:

    // If the target is on the right side of the start point
    if (startPoint.getX() < endPoint.getX()) {
        if (current.getX() < endPoint.getX()) {
            current.x += moveSpeed;
            if (current.getX() > endPoint.getX()) {
                current.x = (int) endPoint.getX();
            }
        }
        else {
            xDone = true;
        }
    }
    else {
        if (current.getX() > endPoint.getX()) {
            current.x -= moveSpeed;
            if (current.getX() < endPoint.getX()) {
                current.x = (int) endPoint.getX();
            }
        }
        else {
            xDone = true;
        }
    }

    // Vise-versa
    if (startPoint.getY() < endPoint.getY()) {
        if (current.getY() < endPoint.getY()) {
            current.y += moveSpeed;
            if (current.getY() > endPoint.getY()) {
                current.y = (int) endPoint.getY();
            }
        }
        else {
            yDone = true;
        }
    }
    else {
        if (current.getY() > endPoint.getY()) {
            current.y -= moveSpeed;
            if (current.getY() < endPoint.getY()) {
                current.y = (int) endPoint.getY();
            }
        }
        else {
            yDone = true;
        }
    }

    // Callback, dw about it
    CardContainer.getCardSprite(CardContainer.SPECIAL, 0).drawSprite((int) current.getX(), (int) current.getY());

    // Alert finished, in poisiuton
    if (xDone && yDone) {
        ch.submitCard(card);
    }

current =当前位置

startPoint =起点

endPoint =结束点

谢谢!

已编辑的代码:

private void applyMovement(double alpha) {
    double dx = endPoint.getX() - startPoint.getX();
    double dy = endPoint.getY() - startPoint.getY();

    this.current.setLocation(startPoint.getX() + alpha * dx, startPoint.getY() + alpha * dy);
}

public void process() {

    double alpha = (double) stepsDone / distance;
    applyMovement(alpha);
    stepsDone++;

    // Callback, dw about it
    CardContainer.getCardSprite(CardContainer.SPECIAL, 0).drawSprite((int) current.getX(), (int) current.getY());

    // Alert finished, in poisiuton
    if (stepsDone >= distance) {
        ch.submitCard(card);
    }
}

距离计算:

 this.distance = (int) start.distance(end);

使用过的Point2D距离法:

public double distance(Point2D pt) {
    double px = pt.getX() - this.getX();
    double py = pt.getY() - this.getY();
    return Math.sqrt(px * px + py * py);
}

2 个答案:

答案 0 :(得分:1)

我建议使用任何形式的&#34;斜坡&#34;在这样的计算中。当x方向的差异接近零时,你会遇到问题,因为那时斜率将倾向于无穷大。

假设您的积分是Point2D.Double(或类似的东西 - 您应该在问题中包含此类信息!),您可以按如下方式计算运动:

private Point2D.Double initial = ... // The initial position
private Point2D.Double current = ... // The current position
private Point2D.Double target = ... // The target position

void applyMovment(double alpha) {
    double dx = target.getX() - initial.getX();
    double dy = target.getY() - initial.getY();
    current.x = initial.getX() + alpha * dx;
    current.y = initial.getY() + alpha * dy;
}

此处勾勒的applyMovment方法可以使用double0.0之间的1.0值进行调用,其中0.0对应于初始位置和{{ 1}}对应于目标位置。这只是Linear Interpolation

例如,当您为动画设置某种循环时,可以按如下方式使用该方法:

1.0

这适用于起点和终点的任何排列,没有任何符号或方向问题。它只是在两个位置之间进行插值。

答案 1 :(得分:0)

您的计算需要基于沿着特定的移动currentYcurrentX,而不是一组特定的时间间隔(moveSpeed)。在一条线上绘制点的公式是:

y = mx + b

xy是不同的点,m等于该行的斜率b是&# 39; s称为 y-intercept

您的斜率由公式计算:

double slope = ((double) endPoint.getY() - startPoint.getY()) / ((double) endPoint.getX() - startPoint.getX());

一旦你拥有它们,就可以通过插入一堆已知值来计算Y截距:

double yIntercept = (double) endPoint.getY() - (slope * endPoint.getX())

然后,只需循环计算X中的差异计数:

for (int xVal = startPoint.getX(); xVal < endPoint.getX(); xVal++){
    currentX = xVal;
    currentY = (slope * xVal) + yIntercept;
}

你应该做得好。

警告:这完全不是我的头脑,我不知道它是否会编译。