2016-01-24 42 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