2016-01-24 45 views
1

我目前正在编写一个简单的游戏,其中有一定数量的战士,每秒增加一定数量的城镇。一个玩家拥有的城镇可以攻击另一个玩家所拥有的城镇,导致原来镇上的士兵数量减少一半,另一半则攻击另一个城镇。获得双倍速度矢量,无需四舍五入就能正确计算

问题是,我代表攻击性的士兵作为朝向另一个城镇的形状,我使用碰撞检测来确定什么时候Attack到达。因此,Attack用于到达城镇的矢量是正确的,以便它实际上到达城镇。

每个城镇都有一个Point字段,称为attackPoint,我用它作为攻击的起点以及它们前往的目的地。 attackPoint位于碰撞场的中间。

下面的代码我有初始化一个Attack并创建运动矢量:

public Attack(int troops, Team owner, Town source, Town destination) { 
    this.troops = troops;    //troops included in the attack 
    this.owner = owner;    //player that who sent the attack 
    this.destination = destination; //town the attack is going towards 

    Point srcPoint = source.getAttackPoint(); //attackPoint of the source 
    Point destPoint = destination.getAttackPoint(); //attackPoint of the destination town 

    x = srcPoint.x;   //int --- the attack originates at the src's attack point 
    y = srcPoint.y;   //int 

    double hypotenuse = Math.sqrt(Math.pow(destPoint.y - y, 2) + Math.pow(destPoint.x - x, 2)); 
    double adjacent = destPoint.x - x; 
    double opposite = destPoint.y - y; 
    xVelocity = 3.0 * (adjacent/hypotenuse);  //field, double 
    yVelocity = 3.0 * (opposite/hypotenuse); 
} 

然后另一种方法实际上移动Attack -

public void move() { 
    x += xVelocity; 
    y += yVelocity; 
} 

我可以从测试的attackPoints返回确认通过getAttackPoint()都是正确的,并且我做碰撞检测的方式正常工作。这里的问题是,似乎我的速度变量或其他一些变量正在变得圆整,因此只有几条预定义的路径可以使用。例如:

//trying to attack X2  //trying to attack X1 
X...............      X------------------ 
.\..............      .........X1..... 
..\.............      ................ 
...\............      ................ 
....\...........      ................ 
.....X1..X2.....      ................ 

“预定义”的路径似乎是每一个30度左右,我可以送Attack的直发上,下,左,右,这就是为什么我觉得有些舍入误差是怎么回事当我计算向量并执行trig时。 当我有两个靠近在一起的城镇时,无论我尝试攻击哪一个城镇,两个Attack都遵循相同的路径(图1)。 另外,当我有一个接近源镇东/西180度的小镇时,我发送的Attack将直接向东/西(图2)。

如果任何人都可以看到出错的地方,或给我一个关于如何允许物体从一个或另一个点直接通道的建议,那将非常感谢!

回答

0

所以研究这个更多,尝试了几个不同的解决方案后,我敢相信,有一些舍入误差事情 - 也许转换Point S的int领域double S,但我不知道。

我所做的工作就是将所有计算移动到move()方法,以便每行都重新计算该行。这对于优化来说不太好,但我没有太多的对象,这有助于Attack朝着其他城镇的方向发展。我一直无法弄清楚最初是什么导致了这个问题,但确保计算能够通过重新计算来检查自己已经解决了问题。

1

虽然我确实检查了计算两维加速度的方法,但看起来很奇怪。

您需要由两点(源和目标)定义的线的斜率。

double slope = (destination.y - source.y)/(destination.x - source.x); 
xVelocity = 1; // do the normalisation as you wish 
yVelocity = xVelocity * slope; 

一般来说,我建议你使用向量而不是x和y变量。您可以概括大多数操作,并使您的代码更具可读性和重复性(在这种情况下,连接源和目标的段将成为由目标源提供的向量)。

+0

感谢您的答复 - 这似乎是关于我在做什么,虽然有点简单。规范化意味着什么? – josephmbustamante

+0

@ wizardarrac斜率只定义了速度矢量的方向。你应用规范化来设置向量的长度,这意味着在这种情况下的速度。新配方没有帮助吗? –

+0

看来我仍然遇到与新公式相同的问题。然而,与你搞乱帮助我意识到了一些事情。无论我用什么数字来修改速度,就像你的例子中的1或我的代码中的3,似乎在每90度之间允许有许多角度。当我将速度调节器设置为非常高的时候,比如30,那么攻击就会到达应有的位置。问题是我似乎无法以较低的速度获得这种效果。 – josephmbustamante