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

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

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

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

Collision filtering allows you to prevent collision between shapes. Cocos2d-x >supports collision filtering using category and groups bitmasks.

Cocos2d-x supports 32 collision categories. For each shape you can specify which category it belongs to. You also specify what other categories this shape can collide with. This is done with masking bits

问题是当我设置:

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

那些 Sprite 没有碰撞检测。但是当我设置时:

invaderPhysicsBody->setContactTestBitmask(true);

碰撞检测。

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

可能发生碰撞的物体:

  1. 入侵者 Sprite 的 vector 。
  2. 玩家导弹的 vector
  3. 入侵者导弹的载体
  4. 播放器的 Sprite
  5. 四个盾牌 Sprite

这是我的 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);

这就是我目前为 Sprite 创建和设置物理形体的方式:

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.

最佳答案

你的代码中有一个很大的错误。 setContactTestBitmask 接受 int 而不是 bool。当你调用shieldPhysicsBody->setContactTestBitmask(true)时,实际上是shieldPhysicsBody->setContactTestBitmask(0x0000001)。并且 0x000001 & 0x000010 = 0,因此不会引发任何联系事件。 spriteA 的 categoryBitmask 和 spriteB 的 ContactTestBitmask 的 & 结果决定了是否会引发接触事件。顺便说一句,一般来说,您不需要手动检查联系人,即:

if ((contact.getShapeA()->getCategoryBitmask() & contact.getShapeB()->getCollisionBitmask()) == 0
    || (contact.getShapeB()->getCategoryBitmask() & contact.getShapeA()->getCollisionBitmask()) == 0)
{
    std::cout << "Overlap!" << std::endl;
}

关于c++ - 如何检查 cocos2d-x v3.1 中的特定冲突? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35849103/

相关文章:

c++ - 分段故障打印文件特征

android - Cocos2dx 构建问题

c++ - 正确处理列表大小为 1 的 std::list erase

c++ - 沿 cocos2dx 中的路径移动动画 Sprite

cocos2d-x - 在代码块中找不到 fontconfig/fontconfig.h

iphone - Cocos2d-x 和 Marmalade - CCCallFuncO 的问题

c++ - 如何正确创建、初始化和访问类的静态成员?

c++ - 如何检查两个任意内存范围在 c/c++ 中不重叠

c++ - dynamic_cast 中的类型必须是指向完整类类型的指针或引用,或者 void *