2013-07-28 80 views
0

我正在研究Java中的一些AI东西。当一个实体走向一个点时,运动看起来并不自然。如果它的出发点和目标是不相等的X和Y距离相互远离,运动看起来是这样的:Unnatural movement平滑运动java

我希望它看起来移动象是这样的:Smoother movement

目前,运动完成像这样:

 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

你的*具体*问题是什么? – gparyani

+1

如果你有两点,你可以简单地计算连接它们的线,然后相应地缩放你的x或y的运动(即,每+ x,加+ 1.2y等 – Kon

回答

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)); 
+0

工程很好,谢谢 – JPatrickDev

2

您正在描述在两点之间绘制直线的过程。

有一些相对简单的整数算法,如Bresenham可能有帮助。