我创建了一个方法,可以将精灵在任何方向上移动到一个恒定速度的点。然后,我为每个要移动的点添加了一个排队系统。
我的问题是如果一个点排队,通常只有第一个动作是正确的,那么精灵似乎会移动到其他点的随机位置。 奇怪的部分是如果我添加
if((int) x != (int) moveInfo.getTargetX() && (int) y != moveInfo.getTargetY()){
...
}else{
this.setPosition(moveInfo.getTargetX(), moveInfo.getTargetY());
...
}
精灵在完成移动到其随机点后将其自身校正到其目标位置。我创建了一个调试器,它不是精灵图像偏移,因为x和y值是真实的。
以下是我创建的一些代码可能导致问题......
x和y是双打。
移动到点排队构造函数:
Queue<MoveInfo> moveTo = new LinkedList<MoveInfo>();
MoveTo类
private class MoveInfo{
private double targetX, targetY;
private double deltaX, deltaY;
private double direction;
private double speed;
private boolean ai;
public MoveInfo(double targetX, double targetY, double speed){
this.targetX = targetX;
this.targetY = targetY;
this.speed = speed;
this.deltaX = targetX - x;
this.deltaY = targetY - y;
calculateDirection();
ai = false;
}
public void calculateDirection(){
this.direction = Math.atan2(deltaX, deltaY);
}
... //Setters and getters.
}
调用每次游戏更新:
private void moveToUpdate(){
if(!spriteMoving && !moveTo.isEmpty()){
if(!moveTo.peek().isAi()){
moveInfo = moveTo.poll();
spriteMoving = true;
System.out.println("Next X"+moveInfo.targetX+" Y"+moveInfo.targetY);
}
}else if(spriteMoving && moveInfo != null){
if((int) x != (int) moveInfo.getTargetX() && (int) y != moveInfo.getTargetY()){
double nextY = y + (moveInfo.getSpeed() * Math.cos(moveInfo.getDirection()));
double nextX = x + (moveInfo.getSpeed() * Math.sin(moveInfo.getDirection()));
setPosition(nextX, nextY);
}else{
this.setPosition(moveInfo.getTargetX(), moveInfo.getTargetY());
spriteMoving = false;
moveInfo = null;
}
}
}
如果您希望查看代码的其他部分,请在评论中告知我们。