COCOS2D-x封装物理引擎Phsics

本文详细介绍了如何使用 Cocos2d-x 的物理引擎创建无重力世界,包括子弹发射、边界设置及碰撞检测的具体实现方法。通过设置不同物体间的碰撞掩码、接触测试掩码和组别,实现精确的物理交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先创建场景:

//创建一个没有重力的物理世界
 auto scene = Scene::createWithPhysics();
 scene->getPhysicsWorld()->setGravity(Vect(0, 0));

 //物理调试绘图

 m_gamelayer = GameScene::create();
 scene->addChild(m_gamelayer);

//给子弹套一个body,加一个初始速度,让其射到物理世界中
其次创建边界 auto body = PhysicsBody::createBox(bullet->getContentSize(), PhysicsMaterial(0, 0, 0));
 body->setVelocity(Vect(0, 500));
 body->setContactTestBitmask(GameScene::ContactMaskBit::HERO_BULLET_CONTACTMASKBIT);
 body->setCollisionBitmask(0x0);
//不进行碰撞模拟,因为不需要。

 bullet->setPhysicsBody(body);

检测碰撞//加入碰撞事件监听auto contactlistener = EventListenerPhysicsContact::create();
 contactlistener->onContactBegin = CC_CALLBACK_1(GameScene::dealWithContact, this);
 _eventDispatcher->addEventListenerWithSceneGraphPriority(contactlistener, this); 

setCategoryBitmask设置_categoryBitmask  类别标示掩码(一个世界最多32个,因为存储类型为int, 共32为,每个类别占用1个位)

setContactTestBitmask设置_contactTestBitmask 接触测试掩码

setCollisionBitmask设置_collisionBitmask 碰撞掩码

setGroup设置_group 组别

①   _collisionBitmask碰撞掩码,表示允许那些类别的物体来和自己发生碰撞,方法是用碰撞双方各自的碰撞掩码_collisionBitmask与对方的类别标示码_categoryBitmask做位与&运算,若都为非零,则发生碰撞,否则不碰撞。例如:

body1->setCategoryBitmask(1)  //(001)

body2->setCategoryBitmask(2)  //(010)

body3->setCategoryBitmask(4)  //(100)

body1-> setCollisionBitmask (6)  //(110)

body2-> setCollisionBitmask (5)  //(101)

body3-> setCollisionBitmask (2)  //(010)

结果:

body1与body2能碰撞,body1和body3不能碰撞,body2和body3能碰撞

分析:为什么body1和body3不能碰撞?

看body1的碰撞掩码000110,它分别与body2和body3的类别码做位与&运算后为非零,表示body1希望可以与body2和body3发生碰撞。再看body3的碰撞掩码000010,同理可知,body3不愿意接受body1的碰撞(只接受body1的碰撞),所以碰撞契约没有达成,不会产生碰撞。同理可知:body1与body2能碰撞,body2和body3能碰撞。


②   _contactTestBitmask接触测试掩码,表示哪些类别的物体“接触”时,会产生消息。这里的“接触”与第①点中的碰撞没有关联,①中的碰撞会实际上产生碰撞效果,而这里的接触只是一个测试碰撞,即如果①中没有发生碰撞,也可以在这里设置产生消息;反之,如果①中发生了碰撞,也可以不在这里产生消息。这完全根据自己游戏的需要来确定。它的方法同①一样,也是用接触双方各自的_contactTestBitmask 接触测试掩码与对方的类别标示码_categoryBitmask做位与&运算,若都为非零,则产生回调消息,否则产生消息(具体产生回调的消息,请参考http://www.benmutou.com/archives/920)。例子就不再列举,同以上一样,只是需要设置setContactTestBitmask,而不是setCollisionBitmask。


③   最后再说说setGroup,其实,网上都能搜到,看源代码也能知道,只是为了完整性,在此一并提一下。它的作用是:当两个对象的_group相等时,如果都为正,则必然碰撞,如果都为负,则必然不碰撞。如果两个对象的_group不相等,那么就需要根据①中的设置来处理了。也就是说:_group的优先级高于_collisionBitmask。

 

补充:如果上面的分析没有看懂,请看这里:分别让body1,body2,body3的掩码与对方的标识码进行位于运算,比如body1的掩码与body2的标识码,body2的掩码与body1的标识码,比较这两个的结果,若都不是0,则可以进行碰撞。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值