Box2D,联系监听器:从不调用 BeginContact
Box2D, Contact Listener: Never calling BeginContact
我一直在尝试将 Box2D 实现到这段代码中,但我一直非常坚持这一点。我到处寻找答案,但找不到任何可以解决此问题的方法。我查看了指南并尝试了帮助其他用户的修复程序,例如执行 b2World->SetAllowSleeping(false)。
我首先创建世界并设置联系人侦听器。 World class 包含 b2World,因此我获取了 world 并设置了联系侦听器。要补充的是,两个指针都存储在一个场景 class 中。
m_World = new World();
m_ContactListener = new ContactListener(m_World);
m_World->GetB2World()->SetContactListener(m_ContactListener);
我 return 指针并将其存储在我的场景中以备日后需要。
我的Contact Listenerclass基本上就是每个教程都讲过的基础知识。我将几行代码放入 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"]));
我再次查看了我的代码和教程,发现我的问题是缺少固定装置。只是为了证明,如果你试图匆忙编写代码,你总会错过一些东西。感谢所有试图帮助我解决这个问题的人。
我一直在尝试将 Box2D 实现到这段代码中,但我一直非常坚持这一点。我到处寻找答案,但找不到任何可以解决此问题的方法。我查看了指南并尝试了帮助其他用户的修复程序,例如执行 b2World->SetAllowSleeping(false)。
我首先创建世界并设置联系人侦听器。 World class 包含 b2World,因此我获取了 world 并设置了联系侦听器。要补充的是,两个指针都存储在一个场景 class 中。
m_World = new World();
m_ContactListener = new ContactListener(m_World);
m_World->GetB2World()->SetContactListener(m_ContactListener);
我 return 指针并将其存储在我的场景中以备日后需要。
我的Contact Listenerclass基本上就是每个教程都讲过的基础知识。我将几行代码放入 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"]));
我再次查看了我的代码和教程,发现我的问题是缺少固定装置。只是为了证明,如果你试图匆忙编写代码,你总会错过一些东西。感谢所有试图帮助我解决这个问题的人。