如何检查cocos2d-x v3.1中的特定冲突? C ++

时间:2016-03-07 16:37:44

标签: c++ cocos2d-x cocos2d-x-3.x

我试图检查精灵与物理身体之间的特定碰撞。问题是我不知道如何为每个节点物理主体分配标签或为每个精灵正确设置碰撞位掩码。我成功地检查了碰撞,但它只对所有对象都是真或假。

我按照我在下面链接的cocos2d-x文档中的指南进行操作。其中,它解释了如何设置屏蔽位和屏蔽类别。

  

碰撞过滤可以防止形状之间发生碰撞。 Cocos2d-x>支持使用类别和组位掩码进行冲突过滤。

     

Cocos2d-x支持32种碰撞类别。对于每个形状,您可以指定它属于哪个类别。您还可以指定此形状可以与之碰撞的其他类别。这是通过屏蔽位

完成的

问题在于我设置时:

sprite1->getPhysicsBody()->setCategoryBitmask(0x02); // 0010 sprite1->getPhysicsBody()->setCollisionBitmask(0x01); // 0001

那些精灵的不是碰撞检测。但是当我设置:

invaderPhysicsBody->setContactTestBitmask(true);

碰撞检测。

有人知道如何成功设置碰撞位掩码或类别位掩码吗?

可能发生碰撞的对象:

  1. 入侵者的精灵矢量。
  2. 玩家导弹的载体
  3. 入侵者导弹的载体
  4. 玩家精灵
  5. 四个用于盾牌的精灵
  6. 这是我的onContactBegin函数,一旦碰撞就会删除它。这是我需要测试哪些物体碰撞的地方。

    bool Gameplay::onContactBegin(PhysicsContact &contact) {
        std::cout << "onContactBegin -------> " << std::endl;
        player_score += 10;
    
        auto nodeA = contact.getShapeA()->getBody()->getNode();
        auto nodeB = contact.getShapeB()->getBody()->getNode();
    
        std::cout << contact.getShapeA()->getTag() << std::endl;
    
        if ((contact.getShapeA()->getCategoryBitmask() & contact.getShapeB()->getCollisionBitmask()) == 0
            || (contact.getShapeB()->getCategoryBitmask() & contact.getShapeA()->getCollisionBitmask()) == 0)
        {
            std::cout << "Overlap!" << std::endl;
        }
        nodeA->removeFromParent();
        nodeB->removeFromParent();
    
        return true;
    }
    

    这是我的碰撞监听器:

     // Enable collision listener.
        auto contactListener = EventListenerPhysicsContact::create();
        contactListener->onContactBegin = CC_CALLBACK_1(Gameplay::onContactBegin, this);
        this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener, this);
    

    这就是我目前为精灵创建和设置物理体的方法:

    int spacing = 0;
        // Four Player Shields
        for (int i = 0; i < 4; i++) {
    
    
            auto shield = Sprite::create("player_shield.png");
    
            auto shield_x = shield->getContentSize();
            auto shield_y = shield->getContentSize();
            auto shieldPhysicsBody = PhysicsBody::createBox(Size(shield_x.width,shield_y.height), PHYSICSBODY_MATERIAL_DEFAULT);
    
            shieldPhysicsBody->setContactTestBitmask(true);
            shieldPhysicsBody->setDynamic(true);
            shieldPhysicsBody->setTag(0);
    
            shield->setPosition(Vec2(200 + spacing, 150));
    
            shield->addComponent(shieldPhysicsBody);
            this->addChild(shield);
            spacing += 200;
        }
    

    Here is the guide I've been following.

1 个答案:

答案 0 :(得分:1)

您的代码存在重大错误。 uniqueValues接受setContactTestBitmask而不是int。当您致电bool时,实际上是shieldPhysicsBody->setContactTestBitmask(true)。并shieldPhysicsBody->setContactTestBitmask(0x0000001),因此不会引发任何联系事件。 spriteA的categoryBitmask和spriteB的ContactTestBitmask的0x000001 & 0x000010 = 0结果确定是否会引发联系事件。顺便说一下,一般来说,您不需要手动检查联系,即:

&