我正在研究Java中的一些AI内容。当一个实体向一个点移动时,该移动看起来并不自然。如果它的起点和目标彼此不相等X和Y距离,则运动如下:
我希望它看起来像这样:
目前,运动是这样完成的:
int tX = target.x;
int tY = target.y;
if(tX> oX){
getOwner().addX(getOwner().getMoveSpeed());
}
if(tX < oX){
getOwner().addX(-getOwner().getMoveSpeed());
}
if(tY> oY){
getOwner().addY(getOwner().getMoveSpeed());
}
if(tY< oY){
getOwner().addY(-getOwner().getMoveSpeed());
}
我猜测有一种比这更好的处理动作的方法。
所以我想知道的可能是如何计算我需要移动的角度,然后需要x和y速度。
答案 0 :(得分:6)
您只需根据每个方向行走的总距离来缩放x和y速度。
只有在需要指定位置时,才有助于以浮点计算并舍入到int
。
int tX = target.x;
int tY = target.y;
float speed = getOwner.getMoveSpeed();
float dX = tX - oX;
float dY = tY - oY;
float dist = Math.sqrt(dX * dX + dY * dY);
float sX = speed * dX / dist;
float sY = speed * dY / dist;
getOwner().addX((int) (sX + 0.5));
getOwner().addY((int) (sY + 0.5));
答案 1 :(得分:2)
您正在描述在两点之间画一条线的过程。
有一些相对简单的纯整数算法,例如Bresenham可能有帮助。