2012-01-21 222 views
2

我正在開發2D側滾動Android遊戲,使用AndEngine及其BOX2D擴展。BOX2D - 與Monster碰撞

我的球員身上,用2個傳感器用於「腳」和「頭」,所以我可能知道哪些球員的側面接觸不同的對象等。這裏的圖像顯示它是如何工作的:

enter image description here

這對於檢查玩家是否正在用腳觸摸地面很有效,所以他可以跳轉等。現在我試圖執行與怪物身體接觸後執行的操作。

在我的接觸式傳感器,我檢查

   if (x1.getBody().getUserData().equals("monster") && x2.getUserData().equals("foot")) 
       { 
        jump(); 
       } 

       if (x1.getBody().getUserData().equals("monster") && x2.getUserData().equals("player")) 
       { 
        GameManager.playSound(lostSound); 
        handleDie(); 
       } 

但每次我在怪物的「頭」跳時間(所以基本上我與腳傳感器觸摸它)死亡的行動被執行。因爲兩個聯繫人都被聯繫人監聽者注意到,所以如果我將腳傳感器設置得更高,它就會更有效地突出玩家身體(玩家身體是玩家的精靈紋理的確切形狀),所以看起來好像玩家和怪物之間沒有接觸在所有。

在此先感謝您的任何提示如何正確處理它。

回答

1

我認爲最簡單的方法就是讓您的「腳」感應器成爲一個堅固的夾具。也讓球員的身材更小。您實際上可以製作3個固定裝置的球員:頭部,身體,腳部。碰撞還是會被處理以正確的方式,但如果你碰怪物,雙腳也沒有辦法去觸摸他的身體,因爲固體夾具的

+0

非常感謝,事實上,它是最簡單的方法,我遇到了與玩家身體有關的一些問題,但最終它仍然有效。我剛剛添加了第三個稱爲'down'的固定夾具 - 所以現在有2個固定夾具和一個傳感器(腳傳感器) – Matim

0

檢查這樣的接觸您的更新方法:

for (b2ContactEdge* ce = feet->GetContactList(); ce; ce = ce->next) 
{ 

    const b2Body* bodyA = c->GetFixtureA()->GetBody(); 
    const b2Body* bodyB = c->GetFixtureB()->GetBody(); 
    //if one of them is a monster, mark him for being ignored this frame. 
} 

for (b2ContactEdge* ce = player->GetContactList(); ce; ce = ce->next) 
{ 
    const b2Body* bodyA = c->GetFixtureA()->GetBody(); 
    const b2Body* bodyB = c->GetFixtureB()->GetBody(); 
    //if the monster is ignored, jump(), else die() 
} 

你可能還應該檢查怪物是否低於玩家。

這是C++,但你應該可以在Java中做類似的事情。

希望它有幫助。

+0

謝謝你的回答,我也會檢查這個解決方案。 – Matim