首先创建场景:
//创建一个没有重力的物理世界
auto scene = Scene::createWithPhysics();
scene->getPhysicsWorld()->setGravity(Vect(0, 0));
//物理调试绘图
m_gamelayer = GameScene::create();
scene->addChild(m_gamelayer);
//给子弹套一个body,加一个初始速度,让其射到物理世界中
其次创建边界: auto body = PhysicsBody::createBox(bullet->getContentSize(), PhysicsMaterial(0, 0, 0));
body->setVelocity(Vect(0, 500));
body->setContactTestBitmask(GameScene::ContactMaskBit::HERO_BULLET_CONTACTMASKBIT);
body->setCollisionBitmask(0x0); //不进行碰撞模拟,因为不需要。
bullet->setPhysicsBody(body);
检测碰撞://加入碰撞事件监听auto contactlistener = EventListenerPhysicsContact::create();
contactlistener->onContactBegin = CC_CALLBACK_1(GameScene::dealWithContact, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactlistener, this);
setCategoryBitmask设置_categoryBitmask 类别标示掩码(一个世界最多32个,因为存储类型为int, 共32为,每个类别占用1个位)
setContactTestBitmask设置_contactTestBitmask 接触测试掩码
setCollisionBitmask设置_collisionBitmask 碰撞掩码
setGroup设置_group 组别
① _collisionBitmask碰撞掩码,表示允许那些类别的物体来和自己发生碰撞,方法是用碰撞双方各自的碰撞掩码_collisionBitmask与对方的类别标示码_categoryBitmask做位与&运算,若都为非零,则发生碰撞,否则不碰撞。例如:
body1->setCategoryBitmask(1) //(001)
body2->setCategoryBitmask(2) //(010)
body3->setCategoryBitmask(4) //(100)
body1-> setCollisionBitmask (6) //(110)
body2-> setCollisionBitmask (5) //(101)
body3-> setCollisionBitmask (2) //(010)
结果:
body1与body2能碰撞,body1和body3不能碰撞,body2和body3能碰撞
分析:为什么body1和body3不能碰撞?
看body1的碰撞掩码000110,它分别与body2和body3的类别码做位与&运算后为非零,表示body1希望可以与body2和body3发生碰撞。再看body3的碰撞掩码000010,同理可知,body3不愿意接受body1的碰撞(只接受body1的碰撞),所以碰撞契约没有达成,不会产生碰撞。同理可知:body1与body2能碰撞,body2和body3能碰撞。
② _contactTestBitmask接触测试掩码,表示哪些类别的物体“接触”时,会产生消息。这里的“接触”与第①点中的碰撞没有关联,①中的碰撞会实际上产生碰撞效果,而这里的接触只是一个测试碰撞,即如果①中没有发生碰撞,也可以在这里设置产生消息;反之,如果①中发生了碰撞,也可以不在这里产生消息。这完全根据自己游戏的需要来确定。它的方法同①一样,也是用接触双方各自的_contactTestBitmask 接触测试掩码与对方的类别标示码_categoryBitmask做位与&运算,若都为非零,则产生回调消息,否则产生消息(具体产生回调的消息,请参考http://www.benmutou.com/archives/920)。例子就不再列举,同以上一样,只是需要设置setContactTestBitmask,而不是setCollisionBitmask。
③ 最后再说说setGroup,其实,网上都能搜到,看源代码也能知道,只是为了完整性,在此一并提一下。它的作用是:当两个对象的_group相等时,如果都为正,则必然碰撞,如果都为负,则必然不碰撞。如果两个对象的_group不相等,那么就需要根据①中的设置来处理了。也就是说:_group的优先级高于_collisionBitmask。
补充:如果上面的分析没有看懂,请看这里:分别让body1,body2,body3的掩码与对方的标识码进行位于运算,比如body1的掩码与body2的标识码,body2的掩码与body1的标识码,比较这两个的结果,若都不是0,则可以进行碰撞。