碰撞检测的回调函数不执行

我用到碰撞检测,代码如下


auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = CC_CALLBACK_1(LoadBall::onContactBegin,this);
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener,this);

调试后发现碰撞后回调函数onContactBegin未执行。用CC_CALLBACK_1不用CC_CALLBACK_2是因为后者报错。网上有说要设置BitMask为0x01的,但我发现用setContactTestBitmask程序运行时会卡在这儿。我又在代码中初始化时直接设置掩码,还是没用。我用的是cocos2dx-3.2,ios。真是很苦恼,我愿为这个问题悬赏200元,希望大神指点。

:9:
setContactTestBitmask是给physicsbody用的,m_ball->getPhysicsBody()->setContactTestBitmask(0x01)。
onContactBegin是个std::function,用lambda也可以的

为什么我添加了还是没用?

你给所有的body都设置这个ContactTestBitmask。那么就一定会有的了

顺便,那个碰撞响应机制挺烦的。满足(bodyA->categoryMask & bodyB->contactMask) && (bodyB->categoryMask & bodyA->contactMask ) 才会执行onContact

我好像知道问题出在哪了,对于一个创建的PhysicsBody,必须给他确定一个形状(addShape),否则碰撞检测就无用。
那么如果想做一个小球和一个很复杂形状的碰撞检测是否就没法做呢?:3::3::3:

很简单的。用PhysicsBody::createPolygon可以创建一个多边形出来,从tmx里面读取点比较简单。可以参考cpp-test里面的 TileMaptest里面的 TMXIsoObjectsTest,和物理测试里面的内容

但是那种特别复杂的图形碰撞检测不知道是怎么做的,比如下图。当年ipod上的一个游戏,小球在特别复杂华丽的迷宫里滚动,与边界的碰撞检测不知道怎么做。

比如上图,不知道是怎么做的。