Box2D,Contact Listener:从不调用BeginContact

时间:2017-03-03 01:36:33

标签: c++ box2d

我一直在尝试将Box2D应用到此代码中,而且我一直非常坚持这一点。我已经搜索了高低的答案,但找不到能解决这个问题的任何东西。我查看了指南并尝试了帮助其他用户的修复程序,例如执行b2World-> SetAllowSleeping(false)。

我首先创建世界并设置联系人监听器。 World类包含b2World,因此我得到了世界并设置了联系人监听器。要添加,两个指针都存储在场景类中。

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

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

我返回指针并将其存储在我的场景中以防万一以后需要它。

My Contact Listener类基本上只是每个教程所说的基础知识。我在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 个答案:

答案 0 :(得分:0)

我再次查看了我的代码和教程,并发现我的问题是缺少固定装置。只是去证明,如果你试图匆匆写下你的代码,你总会错过一些东西。感谢所有试图帮助我解决这个问题的人。