实现b2ContactListener问题(box2d)

时间:2011-10-30 20:03:49

标签: cocos2d-iphone box2d

我正在阅读box2d手册,我看到帧间联系人只能使用b2ContactListener来接收。

我创建了一个类ActorListener(所有活动的世界对象都是actor)

class ActorListener : public b2ContactListener
{ 
    public :
    ActorListener();
    ~ActorListener();

    virtual void BeginContact(b2Contact* contact);
    virtual void EndContact(b2Contact* contact);
    virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);    
    virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);
};

在游戏初始化时将其添加到我的世界中:

    Listener = new ActorListener();
    world->SetContactListener(Listener);

但是一旦发生碰撞,我就会在b2Contact.cpp中收到错误

    if (wasTouching == false && touching == true && listener)
{
    listener->BeginContact(this); //EXC_BAD_ACCESS
}

有什么想法吗?我做错了吗?

1 个答案:

答案 0 :(得分:2)

设置代码正确无误。我建议对ActorListener类进行一些更改:

class ActorListener : public b2ContactListener
{ 
    private :
    void BeginContact(b2Contact* contact);
    void EndContact(b2Contact* contact);
    void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);    
    void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);
};

我不确定这些修补程序是否会改变您的问题。通过添加构造函数,析构函数和更改为公共虚拟方法来更改我的联系人侦听器仍然不会导致崩溃。所以我认为类接口不太可能是问题所在。

然而,除非你需要构造函数或析构函数,否则你可以省略它们。您还应该删除virtual关键字,因为您提供了具体的实现,并且没有计划继承ActorListener(对吗?)。非虚方法有点快。最后这些方法应该是私有的,因为只有Box2D会调用它们,不允许其他代码调用ActorListener类中的方法。如果在进行这些更改后出现编译错误,则可能与崩溃有关。

崩溃表明listener很可能不再指向有效内存,即它已被解除分配。另一种可能是BeginContact中的实际代码导致崩溃但由于某种原因调试器在进行调用的行停止。您可能希望在BeginContact中设置断点。并将BeginContact实现添加到您的问题中。

最后,即使我假设编译器会检查这个,但是ActorListener实现文件的文件扩展名是否设置为.mm?