Cocos2d iphone 实施b2ContactListener问题(box2d)

Cocos2d iphone 实施b2ContactListener问题(box2d),cocos2d-iphone,box2d,Cocos2d Iphone,Box2d,我正在阅读box2d手册,发现只能使用b2ContactListener拾取帧间触点 我创建了一个类ActorListener(所有活动世界对象都是参与者) 并在游戏初始化时将其添加到我的世界: Listener = new ActorListener(); world->SetContactListener(Listener); 但一旦发生碰撞,我就会在b2Contact.cpp中出错 if (wasTouching == false && to

我正在阅读box2d手册,发现只能使用b2ContactListener拾取帧间触点

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

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

    Listener = new ActorListener();
    world->SetContactListener(Listener);
但一旦发生碰撞,我就会在b2Contact.cpp中出错

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

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

设置代码是正确的。我建议对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类中的方法。如果在进行这些更改后出现编译错误,则可能与崩溃有关


崩溃表明
侦听器极有可能不再指向有效内存,即它已被释放。另一种可能是BeginContact中的实际代码导致崩溃,但由于某种原因,调试器在发出调用的行处停止。您可能需要在BeginContact中设置断点。并将BeginContact实现添加到您的问题中


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

“另一种可能是BeginContact中的实际代码导致崩溃。”。就这样。我在那个方法中做了无效的转换。谢谢你的其他建议。看起来干净多了。谢谢你这么好的贡献者。我已经在亚马逊网站上预订了你的书,希望我不会在这里发布太多:)
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);
};