我目前正在編寫一個簡單的遊戲,其中有一定數量的戰士,每秒增加一定數量的城鎮。一個玩家擁有的城鎮可以攻擊另一個玩家所擁有的城鎮,導致原來鎮上的士兵數量減少一半,另一半則攻擊另一個城鎮。獲得雙倍速度矢量,無需四捨五入就能正確計算
問題是,我代表攻擊性的士兵作爲朝向另一個城鎮的形狀,我使用碰撞檢測來確定什麼時候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