2017-03-03 31 views
0

我一直在試圖在此代碼中實現Box2D,並且我一直對此非常困惑。我搜索了高和低的答案,但沒有找到任何可以解決這個問題的東西。我查看了指南並嘗試了幫助其他用戶修復的問題,例如,執行b2World-> SetAllowSleeping(false)。Box2D,聯繫人偵聽器:從不打電話BeginContact

我開始創建世界並設置聯繫人偵聽器。 World類包含b2World,因此我獲得了世界並設置了聯繫人偵聽器。要添加,兩個指針都存儲在一個場景類中。

m_World = new World(); 
    m_ContactListener = new ContactListener(m_World); 

    m_World->GetB2World()->SetContactListener(m_ContactListener); 

我返回指針並將其存儲在我的場景中,以防萬一它稍後有必要。

我的聯繫人監聽器類基本上只是每個教程所說的基礎知識。我在BeginContact()中放入了幾行代碼來放置一個斷點,並嘗試查看它是否工作,但到目前爲止它還沒有工作。

這裏是ContactListener.h:

#pragma once 
class ContactListener : public b2ContactListener 
{ 
private: 
    World* m_World; 
public: 
    ContactListener(World* aWorld); 
    ~ContactListener();` 

    virtual void BeginContact(b2Contact* aContact); 
    virtual void EndContact(b2Contact* aContact); 

    void SetWorld(World* aWorld) { m_World = aWorld; } 
    World* GetWorld() { return m_World; } 
}; 

這裏是ContactListener.cpp文件: 的#include 「pch.h」

ContactListener::ContactListener(World* aWorld) 
{ 
    m_World = aWorld; 
} 

ContactListener::~ContactListener() 
{ 

} 

void ContactListener::BeginContact(b2Contact* aContact) 
{ 
    b2Fixture* fixtureA = aContact->GetFixtureA(); 
    b2Fixture* fixtureB = aContact->GetFixtureB(); 

    void* userDataA = fixtureA->GetUserData(); 
    std::string nameA = ((GameObject*)userDataA)->GetName(); 

    void* userDataB = fixtureB->GetUserData(); 
    std::string nameB = ((GameObject*)userDataB)->GetName(); 
} 

void ContactListener::EndContact(b2Contact* aContact) 
{ 

} 

就像我以前說過,我添加的行代碼只是爲了嘗試並設置一個斷點。我讀過的指南只是簡單地覆蓋功能和一切應該工作。任何有關這個問題的幫助將不勝感激,如果你需要更多的信息,我會很樂意添加任何。

對於身體,我創造了兩個。一個靜態和一個動態。

這是我用來創建機構的功能:

b2Body* World::CreateBody(b2Vec2 aPosition, float aRotation, BodyType aType,   GameObject* aOwner) 
{ 
    b2BodyDef bodyDef; 
    bodyDef.position = aPosition; 
    bodyDef.angle = aRotation; 

    if (aType == KinematicBody) 
    { 
     bodyDef.type = b2_kinematicBody; 
    } 
    else if (aType == DynamicBody) 
    { 
     bodyDef.type = b2_dynamicBody; 
    } 
    else 
    { 
     bodyDef.type = b2_staticBody; 
    } 

    bodyDef.userData = aOwner; 

    return m_b2World->CreateBody(&bodyDef); 
} 

再經過我創建了兩具屍體,我以前談到:

((PlayerObject*)m_pGameObjects["Floor"])->AddBody(m_World->CreateBody(aPosBlock, aRotationBlock, World::BodyType::StaticBody, m_pGameObjects["Floor"])); 
    ((PlayerObject*)m_pGameObjects["Player"])->AddBody(m_World->CreateBody(aPos, aRotation, World::BodyType::DynamicBody, m_pGameObjects["Player"])); 
+1

在您的第一個代碼中,您返回一個指向「temp」的指針,但是當函數退出時,temp將超出範圍。 – lolando

+0

我很確定它做到了。這實際上是我在查找不同指南後編寫的備份功能。我原來在場景中有一個聯繫人偵聽器指針,然後我創建了一個新的實例。 – Temunish

+0

正如lolando所說,你顯示的代碼有'temp'超出範圍。請糾正並重試。如果結果仍然相同,那麼請編輯您的問題以顯示您認爲不再有數據超出範圍的更正代碼。如果它能正常工作,請在回答部分解釋這個問題,這樣這個問題就不會顯示爲沒有答案了。謝謝! –

回答

0

我看了看我的代碼再次和教程,並發現我的問題是缺少燈具。只是去證明,如果你試圖衝你的代碼,你總會錯過一些東西。感謝所有試圖幫助我解決這個問題的人。

相關問題