总结一下:
在初始化各个物体的时候创建并绑定body,初始化场景的时候设置物理世界,在onenter中创建碰撞事件,获得分发器,添加碰撞检测事件,设置碰撞检测事件的处理。
创建子弹的时候:
auto body = PhysicsBody::createBox(bullet->getContentSize());
body->setCategoryBitmask(0x01);//0001
body->setCollisionBitmask(0x02);//0010
body->setContactTestBitmask(0x01);
bullet->setPhysicsBody(body);
创建敌人的时候
auto body = PhysicsBody::create();
if (enemyType == EnemyTypeStone || enemyType == EnemyTypePlanet) {
body->addShape(PhysicsShapeCircle::create(enemy->getContentSize().width / 2 - 5));
} else if (enemyType == EnemyTypeEnemy1) {
Vec2 verts[] ={
Vec2(-2.5,-45.75),
Vec2(-29.5,-27.25),
Vec2(-53, -0.25),
Vec2(-34,43.25),
Vec2(28, 44.25),
Vec2(55,-2.25)};
body->addShape(PhysicsShapePolygon::create(verts ,6));
} else if (enemyType == EnemyTypeEnemy2) {
Vec2 verts[] ={
Vec2(1.25, 32.25),
Vec2(36.75, -4.75),
Vec2( 2.75, -31.75),
Vec2(-35.75,-3.25)};
body->addShape(PhysicsShapePolygon::create(verts, 4));
}
body->setCategoryBitmask(0x01);//0001
body->setCollisionBitmask(0x02);//0010
body->setContactTestBitmask(0x01);
enemy->setPhysicsBody(body);
创建飞机时
auto body = PhysicsBody::createPolygon(verts, 5);
body->setCategoryBitmask(0x01);//0001
body->setCollisionBitmask(0x02);//0010
body->setContactTestBitmask(0x01);
fighter->setPhysicsBody(body);
场景绑定物理世界
PhysicsWorld* phyWorld = scene->getPhysicsWorld();
//phyWorld->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
//0,0不受到重力的影响
phyWorld->setGravity(Vect(0,0));
碰撞检测事件处理
//注册 碰撞事件监听器
contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = [this](PhysicsContact& contact)
{
auto spriteA = contact.getShapeA()->getBody()->getNode();
auto spriteB = contact.getShapeB()->getBody()->getNode();
Node* enemy1 = nullptr;
检测 飞机与敌人的碰撞 start//
log("A = %d ------------ B = %d", spriteA->getTag(), spriteB->getTag());
if (spriteA->getTag() == GameSceneNodeTagFighter && spriteB->getTag() == GameSceneNodeBatchTagEnemy)
{
enemy1 = spriteB;
}
if (spriteA->getTag() == GameSceneNodeBatchTagEnemy && spriteB->getTag() == GameSceneNodeTagFighter)
{
enemy1 = spriteA;
}
if (enemy1 != nullptr) {//发生碰撞
this->handleFighterCollidingWithEnemy((Enemy*)enemy1);
return false;
}
/检测 飞机与敌人的碰撞 end/
检测 炮弹与敌人的碰撞 start
Node* enemy2 = nullptr;
if (spriteA->getTag() == GameSceneNodeBatchTagBullet &&
spriteB->getTag() == GameSceneNodeBatchTagEnemy)
{
//不可见的炮弹不发生碰撞
if (!spriteA->isVisible())
return false;
//使得炮弹消失
spriteA->setVisible(false);
enemy2 = spriteB;
}
if (spriteA->getTag() == GameSceneNodeBatchTagEnemy
&& spriteB->getTag() == GameSceneNodeBatchTagBullet)
{
//不可见的炮弹不发生碰撞
if (!spriteB->isVisible())
return false;
//使得炮弹消失
spriteB->setVisible(false);
enemy2 = spriteA;
}
if (enemy2 != nullptr) {//发生碰撞
this->handleBulletCollidingWithEnemy((Enemy*)enemy2);
return false;
}
/检测 炮弹与敌人的碰撞 end/
return false;
};
eventDispatcher->addEventListenerWithFixedPriority(contactListener,1);