我正在尝试检查精灵与物理体之间的特定碰撞。问题是我不知道如何为每个节点物理体分配标签或为每个精灵正确设置碰撞位掩码。我成功地检查了碰撞,但它只是对所有对象的真或假。
我正在遵循我在下面链接的 cocos2d-x 文档中的指南。在其中,它解释了如何设置屏蔽位和屏蔽类别。
碰撞过滤允许您防止形状之间的碰撞。Cocos2d-x > 支持使用类别和组位掩码进行碰撞过滤。
Cocos2d-x 支持 32 种碰撞类别。对于每个形状,您可以指定它属于哪个类别。您还可以指定此形状可以与哪些其他类别发生冲突。这是通过屏蔽位完成的
问题是当我设置时:
sprite1->getPhysicsBody()->setCategoryBitmask(0x02); // 0010
sprite1->getPhysicsBody()->setCollisionBitmask(0x01); // 0001
这些精灵没有碰撞检测。但是当我设置时:
invaderPhysicsBody->setContactTestBitmask(true);
有碰撞检测。
有人知道如何成功设置冲突位掩码或类别位掩码吗?
可能发生碰撞的物体:
- 入侵者的精灵矢量。
- 玩家导弹的矢量
- 入侵者导弹的载体
- 玩家精灵
- 盾牌的四个精灵
这是我的 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;
}