2015-10-05 94 views
0

嗨,我有一個由多個物體組成的物體,它們之間的區別是有人是過濾器,而其他人不是。 我希望我的演員在與物理側碰撞時被破壞,並在碰撞傳感器時產生不同的效果。 那麼,如果我的碰撞監聽器中有一部分或另一部分發生接觸,我該如何檢查?libgdx - 與不同物體制成的物體碰撞

+0

http://stackoverflow.com/questions/17829115/libgdx-and-box2d-detect-collision-of-two-specific-bodies/17829707#17829707 這可能幫助 –

回答

0

比方說,你有一張桌子和一堆奶牛,你想要確定是否有牛與表碰撞。

Body table; 
Array<Body> cows; 

//define the table and cows 

ContactListener listener = new ContactListener() { 

    @Override 
    public void beginContact(Contact contact) { 
    Body bodyA = contact.getFixtureA().getBody(); 
    Body bodyB = contact.getFixtureB().getBody(); 

    for (Body cow : cows) { 
     if (((cow == bodyA) || (cow == bodyB)) && 
     ((table == bodyA) || (table == bodyB))) { 
      //do something 
     } 
    } 
    } 
}; 

這是一個通用的答案,但它會告訴你如何檢查哪些機構發生了碰撞,我相信回答你的問題。

+0

我接觸監聽器有沒有我的知名度對象。該項目是一個有幾個級別的遊戲,我創建了任何級別的不同種類的對象的新實例。我可以通過這些bodyA和bodyB來檢查哪個身體(來自碰撞類屬性的身體)與另一個actor發生碰撞?現在我的技術就像「if(bodyA.getUserata()instaceof ClassA && bodyB.getUserData()ClassB的實例)」,但在這種情況下,該類的實例是不夠的,我需要現在,如果它是一個特定的該類的主體 –

+0

只要您在類的對象中提供了一個getter方法,該方法可以由偵聽器訪問,以告知偵聽器該主體是否可以碰撞。像'bodyA.isCollideable();'''''''''''''''''''''''''' 'MyBodyClass bodyA =(MyBodyClass)contact.getFictureA()。getBody();'擴展Body並添加getter方法的替代方法是使用'get [set] UserData()'設置並獲取'boolean' if身體是可以碰撞的。 –

+0

我的課程沒有擴展正文。它有三個屬性,只有其中一個應該可以與其他副作用交叉,以便在偵聽器中執行 –

0

有可能有很多方法可以做到這一點,但這裏是我如何做我的物理遊戲對象映射。不是我堅持宗教的東西,但我嘗試 - 總是有例外。

如果我有一個「遊戲對象」,它有一個主體。屍體用戶數據被設置爲該對象。

如果我有一個由部件組成的「遊戲對象」,這些部件就是「遊戲對象部件」,它們將是body的燈具的用戶數據。

我的「遊戲對象」是與「身體有夾具」部件相同方式的「部件對象」的組合。

如果你有這樣的事情,那麼你可以很容易地區分碰撞中物體的各個部分。如果你真的希望你的「遊戲對象」由於其他原因而由多個物體組成,那麼我仍然會讓「遊戲物體」具有「部件」,這些「部件」被設置爲構成它的物體的用戶數據。希望有所幫助。

我還要再走一步 - 我的「遊戲對象」擁有自己的碰撞處理程序集合。所以我的單個註冊的碰撞偵聽器獲取用戶數據對象並使用相同的參數調用它們的碰撞處理程序。利用多態性傢伙。現在我可以將給定對象所需的碰撞行爲附加到該對象上。我不必遍歷所有對象來決定在註冊的碰撞偵聽器中做什麼。

+0

我已經解決了我的情況,碰撞處理程序部分是一個好主意,非常有用,雖然 –