PhysicsBody PhysicsShape 两个类里面都有这3个函数
setCategoryBitmask(int bitmask) setContactTestBitmask(int bitmask) setCollisionBitmask(int bitmask)
设置两个物体是否碰撞, 应用的什么机制啊?


怎么 分别设置 两个物体的 位掩码 让其 碰撞或者 不碰撞?? 跪求啊~~
继续跪求。。
box1->getPhysicsBody()->setCategoryBitmask(0x01); // 0001
box1->getPhysicsBody()->setContactTestBitmask(0x04); // 0100
box->getPhysicsBody()->setCollisionBitmask(0x03); // 0011
box2->getPhysicsBody()->setCategoryBitmask(0x02); // 0010
box2->getPhysicsBody()->setContactTestBitmask(0x08); // 1000
box2->getPhysicsBody()->setCollisionBitmask(0x01); // 0001
box3->getPhysicsBody()->setCategoryBitmask(0x04); // 0100
box3->getPhysicsBody()->setContactTestBitmask(0x01); // 0001
box3->getPhysicsBody()->setCollisionBitmask(0x06); // 0110
box1 和 box2 发生碰撞, box1与box3 box 2与box3 都不发生碰撞
详细可惜看 3.0rc版本 cpp-tests:: PhysicsTest 的 PhysicsContactTest类。。
有知道的没? 给解释下 设置什么值可以碰撞/不碰撞 。。。
CategoryBitmask表示“我是谁”
ContactTestBitmask表示“在我和谁发生碰撞通知我”,是否调用我注册的回调函数。
CollisionBitmask表示”我和谁发生碰撞“,如果a->CategoryBitmask & b->CollisionBitmask等于0或者b->CategoryBitmask & a->CollisionBitmask等于0,不发生碰撞,可以看到物体穿越另一个物体。
相当于在自己注册的回调函数中添加如下代码:
bool ClassName::::onContactBegin(cocos2d::PhysicsContact& contact)
{
if ((contact.shapeA->getCategoryBitmask() & contact.shapeB->getCollisionBitmask()) == 0
|| (contact.shapeB->getCategoryBitmask() & contact.shapeA->getCollisionBitmask()) == 0)
{
return false;
}
//其它代码
return true;
}
非常感谢~~
源码:
// bitmask check
if ((shapeA->getCategoryBitmask() & shapeB->getContactTestBitmask()) == 0
|| (shapeA->getContactTestBitmask() & shapeB->getCategoryBitmask()) == 0)
{
contact.setNotificationEnable(false);
}
if (shapeA->getGroup() != 0 && shapeA->getGroup() == shapeB->getGroup())
{
ret = shapeA->getGroup() > 0;
}
else
{
if ((shapeA->getCategoryBitmask() & shapeB->getCollisionBitmask()) == 0
|| (shapeB->getCategoryBitmask() & shapeA->getCollisionBitmask()) == 0)
{
ret = false;
}
}
搞不懂为什么要 互粉了才派发消息出来。。。