我正在使用cocos2dx并使用相同的“物理主体”定义设置两个Sprite,请参见下文
PhysicsBody *physicsBody=PhysicsBody::createBox(size,PhysicsMaterial(1.0f,0.0,0.5f),Vec2(0, size.height*0.5));
physicsBody->setGravityEnable(true);
physicsBody->setCategoryBitmask(1);
physicsBody->setCollisionBitmask(1);
physicsBody->setContactTestBitmask(true);
physicsBody->setDynamic(true);
physicsBody->setContactTestBitmask(0xFFFFFFFF);
physicsBody->setMass(5.0f);
node->setPhysicsBody(physicsBody);
我正在两个物理物体之间定义一个
collision detection
auto contactListener=EventListenerPhysicsContactWithBodies::create(player1->getPhysicsBody(), player2->getPhysicsBody());
contactListener->onContactBegin = CC_CALLBACK_1(Game::onPlayerContact, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);
我不希望这两个物体相互碰撞,或者如果它们碰撞,也不希望受到任何物理影响。我在做
bool Game::onPlayerContact(cocos2d::PhysicsContact &contact){
auto nodeA = contact.getShapeA()->getBody()->getNode();
auto nodeB = contact.getShapeB()->getBody()->getNode();
if(nodeA != NULL && nodeB != NULL){
printf("\nPlayers collided");
}
return false;
}
我无法绕过两个物体之间的接触,还应该做些什么以避免碰撞?
请帮忙。
谢谢。
最佳答案
碰撞过滤使您可以防止形状之间的碰撞。 Cocos2d-x支持使用类别和组位掩码的冲突过滤。
Cocos2d-x支持32种碰撞类别。您可以为每个形状指定其所属的类别。您还可以指定此形状可以与其他类别碰撞。这是通过屏蔽位完成的。例如:
auto sprite1 = addSpriteAtPosition(Vec2(s_centre.x - 150,s_centre.y));
sprite1->getPhysicsBody()->setCategoryBitmask(0x02); // 0010
sprite1->getPhysicsBody()->setCollisionBitmask(0x01); // 0001
auto sprite3 = addSpriteAtPosition(Vec2(s_centre.x + 150,s_centre.y + 100),2);
sprite3->getPhysicsBody()->setCategoryBitmask(0x03); // 0011
sprite3->getPhysicsBody()->setCollisionBitmask(0x03); // 0011
然后在您的碰撞回调中。做这个。
if ((shapeA->getCategoryBitmask() & shapeB->getCollisionBitmask()) == 0
|| (shapeB->getCategoryBitmask() & shapeA->getCollisionBitmask()) == 0)
{
// shapes can't collide
ret = false;
}
来源:http://www.cocos2d-x.org/wiki/Physics
关于ios - cocos2dx-绕过 body 接触,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29620125/