2015-05-19 83 views
2

我正在用Java製作遊戲。玩家和敵人之間的碰撞並不正確。玩家與敵人不能正常工作的衝突

我想要什麼:當它們相撞時,它是遊戲結束,我們需要去遊戲結束面板。相反:敵人跑過玩家,遊戲剛剛開始。

我複製粘貼了一段我的代碼,我真的希望有人能找到我做錯了什麼。

有關更多信息,玩家和敵人可以互相發射子彈,並且碰撞可以發揮作用。玩家和敵人都會發現隨機放置的障礙物。

怎麼做才能當玩家與敵人碰撞:

for(Enemy enemy: enemies){ 
if (checkCollision(player, enemy)){ 
    player.dead = true; 
    } 
} 

我更新的動作進行功能的播放器:

if (!player.dead) 
      player.redraw(); 

else 
{ 
    spelTimer.stop(); 
    mainVenster.switchPanel(new GameOverPanel(mainVenster));} 

功能checkCollision(IDK如果這會有所幫助):

public boolean checkCollision(tanks.Game_Object object1, tanks.Game_Object object2){ 

    double dx = object1.x_pos - object2.x_pos; 
    double dy = object1.y_pos - object2.y_pos; 
    double distance = (dx*dx) + (dy*dy); 
    double minDistance = (object1.r+object2.r); 

    return (distance < minDistance*minDistance);  
} 

編輯:x_pos和y_pos是我的對象的中心座標,r是ra DIUS。

+2

這是可能的幀速率不夠高而即使子彈*看起來*像它的交叉播放器,程序只看到之前的幀與幀後。您可能想要嘗試將閾值minDistance提高到兩倍,並查看事情的工作方式。 – bcr

+0

你是如何更新座標的? – haifzhan

+0

@bcr我會試着去看看給出了什麼。但我必須說,當我(玩家)在敵人或障礙物上射擊(我擊中他們)時,他們會被移除。 – ml20

回答

0

可能

public boolean checkCollision(tanks.Game_Object object1, tanks.Game_Object object2){ 

    double dx = object1.x_pos - object2.x_pos; 
    double dy = object1.y_pos - object2.y_pos; 
    double distance = (dx*dx) + (dy*dy); 
    double minDistance = (object1.r+object2.r); 

    return (Math.sqrt(distance) < minDistance);  
} 
+1

您正在從左上角計算。你需要從圈子的中心計算 – ControlAltDel

+0

我不認爲添加一個sqrt()會做到這一點,但我會嘗試!如果你看到x_pos和y_pos作爲中心座標,那麼@ControlAltDel就不是這個代碼嗎? – ml20

+0

@ ml20它可能無法做到這一點。但他似乎指出了一個沒有人注意到的缺陷。 a^2 + b^2 = c^2。你的距離計算不正確,你需要得到c的平方根,這在你的情況下是'距離'。如果問題沒有解決,這絕對是解決問題的重要步驟。 –

0

對於這種情況,我會建議Rectangle。當你創建一個Rectangle時,你可以告訴它左上角的點,那麼它在每個方向上的延伸程度如何(就像你試圖找出你的方法)。然後你只需要用球員(使用rectangle.reshape(x,y,width,height))更新Rectangle,並且在你目前檢查碰撞的任何地方,用碰撞方法檢查球員的敵手Rectangle上的Rectangle

Rectangle r = new Rectangle(x,y,100,100); 
Rectangle q = new Rectangle(x2,y2,100,100); 
if(r.intersects(q)){ 
    //What occurs during collision 
} 
+0

這不是最佳的抽象形狀的碰撞遠這樣 – ControlAltDel

+0

@ControlAltDel是的,這是有道理的,這是一個看着它......我不知道爲什麼我之前沒想到它圓,但如果他們100%真的是圓,那麼這不是做到這一點的方法。但是,如果它們仍然有效,它仍然可以工作。 –

+0

嗯,這是我嘗試的第一件事,但是當兩個物體發生碰撞時,它給我帶來了困難,因爲我的玩家和敵人可以翻譯和旋轉。 – ml20

-2

其實對於在模型化關於java遊戲衝突的最好方法是畫4個命中框:你的角色權 一個非常薄的頂部,底部,左側矩形。 然後,如果敵方的一個命中盒包含玩家的命中盒(未命中相交方法),則會知道發生了碰撞,甚至更好,您將知道碰撞的一側。

更多信息: https://www.youtube.com/watch?v=mdJNtXP1QiY

+0

不會在角色周圍繪製4個框,就像包含玩家的1個大框一樣有效? –

+0

根本不是!如果有一個命中盒,並且我們將左上角與敵人的一個命中盒相交,那麼碰撞是頂部還是左側?這就是爲什麼分開它們更好。 https://www.youtube.com/watch?v=mdJNtXP1QiY – Smallware

+0

但有了這個邏輯我可以爭辯說,存儲每個像素的每個點是最好的方法去做這件事,即使最終玩家立即死亡,至少我們將確切知道路口的位置......雖然我確實知道你要去哪裏,但在這種情況下,它並不重要。 –

1

您的播放器和敵人由圓圈表示,對不對?這就是你的代碼看起來的樣子。在這種情況下,正確的碰撞計算公式爲:

double dist = Math.sqrt(Math.sqr(obj1.x + ob1.radius - obj2.x - obj2.radius) + Math.sqr(obj1.y + ob1.radius - obj2.y - obj2.radius)); 

if (dist < (obj1.radius + obj2.radius)) { 
    //collision 
} 
+0

是的,我之前嘗試過使用矩形,但由於玩家和敵人都可以翻譯和旋轉(他們是'坦克'),所以它給了我很多難題。我看着你說的話,它看起來和我的checkCollision函數非常相似(我的x_pos和y_pos是我的對象的中心協調)? – ml20

+1

你應該不得不提及它的位置在你的圖紙的中心位置:) – Soley