cocos2dx - 绕过身体接触

时间:2015-04-14 05:58:24

标签: ios cocos2d-x game-physics cocos2d-x-3.0 chipmunk

我正在使用 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;
}

我无法绕过两个身体之间的接触,还应该做些什么来避免碰撞?

请帮助。

感谢。

2 个答案:

答案 0 :(得分:2)

碰撞过滤可以防止形状之间发生碰撞。 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

答案 1 :(得分:0)

您可能想要检查物理下的查询 http://www.cocos2d-x.org/wiki/Physics 也许Point Query ..

基本上Box2d有传感器,用于检测接触而不是任何碰撞...... 我推荐使用Box2d而不是Cocos2d物理......它更好......