我目前正在编写一个简单的游戏,其中有一定数量的战士,每秒增加一定数量的城镇。一个玩家拥有的城镇可以攻击另一个玩家所拥有的城镇,导致原来镇上的士兵数量减少一半,另一半则攻击另一个城镇。获得双倍速度矢量,无需四舍五入就能正确计算
问题是,我代表攻击性的士兵作为朝向另一个城镇的形状,我使用碰撞检测来确定什么时候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)。
如果任何人都可以看到出错的地方,或给我一个关于如何允许物体从一个或另一个点直接通道的建议,那将非常感谢!
感谢您的答复 - 这似乎是关于我在做什么,虽然有点简单。规范化意味着什么? – josephmbustamante
@ wizardarrac斜率只定义了速度矢量的方向。你应用规范化来设置向量的长度,这意味着在这种情况下的速度。新配方没有帮助吗? –
看来我仍然遇到与新公式相同的问题。然而,与你搞乱帮助我意识到了一些事情。无论我用什么数字来修改速度,就像你的例子中的1或我的代码中的3,似乎在每90度之间允许有许多角度。当我将速度调节器设置为非常高的时候,比如30,那么攻击就会到达应有的位置。问题是我似乎无法以较低的速度获得这种效果。 – josephmbustamante