【问题标题】:Box2D Contact Listener Collision Only Works IntermittentlyBox2D Contact Listener Collision 仅间歇性工作
【发布时间】:2018-08-01 04:25:29
【问题描述】:

我有一个动态体与一个动态体碰撞,一个简单的接触监听器类如下所示:

void myContactListener::BeginContact(b2Contact* contact)
{
    void* bodyUserData = contact->GetFixtureA()->GetBody()->GetUserData();

    if (bodyUserData)
    {
        static_cast<EnemyEntity*>(bodyUserData)->startContact();
    }

    bodyUserData = contact->GetFixtureB()->GetBody()->GetUserData();

    if (bodyUserData)
    {
        static_cast<EnemyEntity*>(bodyUserData)->endContact();
    }
}

void myContactListener::EndContact(b2Contact* contact)
{
    void* bodyUserData = contact->GetFixtureA()->GetBody()->GetUserData();

    if (bodyUserData)
        static_cast<EnemyEntity*>(bodyUserData)->endContact();

    bodyUserData = contact->GetFixtureB()->GetBody()->GetUserData();

    if (bodyUserData)
        static_cast<EnemyEntity*>(bodyUserData)->endContact();
}

每当我将任一动态体相互移动时,总是会在第一时间检测到碰撞并停止碰撞。但是,如果我再次尝试碰撞它们,它通常不会在第一次之后检测到任何碰撞。但有时确实如此。我能做些什么来解决这个问题?我的代码中没有其他内容涉及任何 Box2D 代码。

这是我的联系人监听头文件:

class myContactListener : public b2ContactListener
{
private:
public:
    // Contact listener methods
    void BeginContact(b2Contact* contact);
    void EndContact(b2Contact* contact);
};

还有 EnemyEntity Box2D 方法:

void EnemyEntity::createStarBox2DCollision(b2World *world)
{
    enemyType = EnemyType::Star;

    def.type = b2_dynamicBody;
    def.position.Set(1000, 1000);
    body = world->CreateBody(&def);
    box.SetAsBox(rectShapeSize.x / 2, rectShapeSize.y / 2);

    fixtureDef.shape = &box;
    fixtureDef.density = 1.0;
    fixtureDef.friction = 0.3;

    body->CreateFixture(&fixtureDef);
    body->SetUserData(this);
}

【问题讨论】:

    标签: c++ collision-detection box2d


    【解决方案1】:

    看来你应该有

    void myContactListener::BeginContact(b2Contact* contact)
    {
        ...
            static_cast<EnemyEntity*>(bodyUserData)->startContact();
        }
    }
    

    而不是

    void myContactListener::BeginContact(b2Contact* contact)
    {
        ...
        static_cast<EnemyEntity*>(bodyUserData)->endContact();
        }
    }
    

    适用于两个机构,而不仅仅是适用于 A

    【讨论】:

    • 谢谢你,但不幸的是,这并没有解决问题。
    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2019-11-22
    • 2015-12-02
    • 2020-06-12
    • 2012-08-08
    相关资源
    最近更新 更多