gpt4 book ai didi

java - Motion 沿对角线从一个点移动到另一个点

转载 作者:行者123 更新时间:2023-11-30 11:13:11 26 4
gpt4 key购买 nike

所以我正在开发一个 21 点游戏,我编写了一个渲染过程,它将渲染一张牌从牌堆中出来并滑动到它显示所有庄家牌的地方。

我的方法工作正常,除了一个问题,我将详细说明:

每当 Y 坐标首先到达目标 Y 坐标时, Sprite 将只在 X 轴上移动,因为它不能再移动 Y,而不是与该点成直角。

所以它会做的是沿对角线向上移动,然后立即向右移动(在我的例子中)

动图:

IMG
(来源:gyazo.com)

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);
}

最佳答案

我建议在这样的计算中不要使用任何形式的“斜率”。当 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;
}

可以使用 0.01.0 之间的 double 值调用此处描述的 applyMovment 方法,其中 0.0对应初始位置,1.0对应目标位置。这只是一个 Linear Interpolation .

因此,例如,当您有某种动画循环时,您可以使用如下方法:

int numberOfSteps = 10;
for (int i=0; i<=numberOfSteps; i++)
{
double alpha = (double)i / numberOfSteps;
applyMovement(alpha);
repaint();
}

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

关于java - Motion 沿对角线从一个点移动到另一个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26516606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com