2017-10-12 63 views
0

在我用slick2d創建的遊戲中學習Java,我有多個層次,每個層次都有一個Footballer和多個其他單位,我希望足球運動員能夠與之交互。我還希望其他單位彼此互動(例如多個Ball與彼此碰撞)(注意,其中一些單位有時與另一個單位相同)。我不確定,但是如何檢測這些交互並適當地更新單元。例如,我有我的FootballerJava&Slick2d - 對象互動

public class Footballer extends Unit { 
    public Footballer(float x, float y){ 
     super("res/ballerpicture", x, y) 
     } 
    } 

這個類我有它覆蓋在單元類更新功能的更新功能中(讓我根據我的輸入移動一個Footballer - 這是工作不除碰撞檢測以外的問題)。

然後我可以,例如,已經裝上我的地圖5球:

public class Ball extends Unit { 
    public Ball(float x, float y){ 
     super("res/ballpicture", x, y) 
     } 
    } 

舉一個例子,我想知道如何在碰撞與Footballer更新球中的任何一個,移動他們每次碰撞時都離開玩家一塊。

我的Unit類包括一個move方法,該方法基於整數方向移動單元(左= 1,右= 2等)。

道歉,如果我超飽和這個問題或沒有包含足夠的信息 - 我是相對較新的Java。

回答

1

你在找什麼是collision detection。 所有能夠相互作用的物體都可以有一個hitbox,這是最簡單的一種代表物體的幾何形狀。舉例來說,我們可以假設你的球有一個圓圈作爲半徑爲8px的hitbox,你的足球運動員有一個寬度爲32px和高度爲32px的矩形的hitbox。

當兩個對象都在移動時,你必須檢查你的hitbox邊界是否相互交叉,如果是的話:做一些事情,如果不繼續移動。

在Slick2D中,所有形狀都有一個名爲intersects(Shape s)的方法,如果兩個形狀的邊界相交,它將返回true。所以基本上你只需要爲你的對象實現點擊框(確保當你的對象正在移動時更新點擊框),然後檢查相交。有很多不同的方式來實現碰撞檢測,互聯網正在爲這個話題提供大量的重新定位。我也建議看看Slick2D的Shape documentation。很難爲您編寫解決方案,因爲我不知道您的代碼,但我相信您會發現它,Slick2D爲交叉方法的問題提供了一個簡單的預先實現的解決方案。

它可能看起來有點像下面這樣:

編輯,多球:

//in your update method 
for(Ball ball : allBalls){ 
if(footballer.getHitbox().intersects(ball.getHitbox()){ 
//get direction of footballer 
ball.move(...) 
} 
} 
+1

謝謝!這是在球員還是球的更新方法?有可能在某些級別會出現多個球 - 我該如何解決這個問題? –

+0

這取決於你的遊戲架構。我會執行到玩家。您可以將所有球存儲在列表中檢查每個元素的交集(注意,這是計算密集型的)。但它基本上取決於你的球如何存儲在你的遊戲世界。您也可以將其應用到球的更新方法中,並調用遊戲中每個球的每個更新方法。 –

+0

我編輯了我的帖子,通過遍歷列表來向你展示我的意思。 –