【问题标题】:cocos2dx - Bypass body contactcocos2dx - 绕过身体接触
【发布时间】:2015-04-14 05:58:24
【问题描述】:

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

我无法绕过两个身体之间的接触,应该怎么做才能避免碰撞?

请帮忙。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    碰撞过滤允许您防止形状之间的碰撞。 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

    【讨论】:

    • 我不认为最后一段代码是正确的;在 Cocos2d-x wiki 中,这只是作为检查两个物体是否可能发生碰撞的示例。通过按照您的方式设置遮罩,您将不会在碰撞回调中看到这两个物体发生碰撞,这就是您要提出的全部观点,不是吗?
    • @sanchitgulati 我的代码与您的代码有何不同,我也将联系代表告诉bypass and returning false; 碰撞和类别位掩码有什么作用吗?
    • 此链接适用于 box2d,但遵循相同的概念 iforce2d.net/b2dtut/collision-filtering
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-26
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多