cocos2d-x 3.0+ 中全新的封装的物理引擎给了开发者最大的便捷,你不用再繁琐与各种物理引擎的细节,完全的封装让开发者可以更快更好的将物理引擎的机制添加到自己的游戏中,简化的设计是从2.0到3.0+的一个质的飞跃。
下面同样以一个小demo来展示一下物理引擎的运用,同时说一下我在运用物理引擎中遇到的一些小小的问题。
cocos2d-x 3.0+中的物理属性:
1、物理世界被集成到场景中,当你创建一个场景,你可以直接创建基于物理世界或者不使用物理世界的场景。
2、Node拥有它自己的body属性。(sprite也是node)‘
3、cocos2d-x 3.0 已经封装了物理属性Body(PhysicsBody),Shape(PhysiCSShape),Contact(PhysicsContact),Joint(PhysicsJoint)和World(PhysicsWorld),更加方便使用。
4、方便的使用Listener-EventListenerPhysicsContact进行碰撞检测。
当然,封装好的物理引擎可以简化开发难度,如果有能力的话也可以直接使用Box2D和Chipmunk的原生的物理引擎进行开发,这样难度会有所提升。
下面的代码创建一个带物理世界的场景,并传递到场景中的层上。
Physicslayer.h中
?
1 2 3 4 5 6 7 8 9 10 | class Physicslayer : public cocos2d::Layer { ... // add following codes设置层中的物理世界 voID setPhyWorld(PhysicsWorld* world){m_world = world;} private : PhysicsWorld* m_world; ... } |
?
Scene* Physicslayer::createScene() // add following codes auto scene = Scene::createWithPhysics(); scene->getPhysicsWorld()->setDeBUGDrawMask(PhysicsWorld::DEBUGDRAW_ALL); //调试 auto layer = HelloWorld::create(); layer->setPhyWorld(scene->getPhysicsWorld()); //将创建的物理世界传递到子层中 ... return scene; } |
Scene类有一个新的static工厂方法createWithPhysics()创建一个带物理世界的场景。可以通过getPhysicsWorld()来获取PhysicsWorld的实例。
上述代码中注释为调试的代码在调试中非常有用,它会显示游戏中物体所带有的物理边界,便于观察碰撞中的细节等。
同时一个场景中只能有一个物理世界,所有属于这个场景的子层都共享这一个物理世界,所以在子层中用到物理世界时都会有这个定义的函数
1
PhysicsWorld拥有默认的重力设置,Vector(0.0f,-98.0f),当然你也可以随意设置你想要的重力加速度,setGravity(Vect(0.0f,-200.0f)),设置重力加速度为20米每二次方秒。
创建物理边界 下面的代码创建一个物理边界 ?Size visibleSize = Director::getInstance()->getVisibleSize(); auto body = PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAulT, 3 ); //设置要添加到节点中的物理body auto edgeNode = Node::create(); edgeNode->setposition(Point(visibleSize.wIDth/ 2 ,visibleSize.height/ )); edgeNode->setPhysicsBody(body); //将物理body加入到创建的节点中 scene->addChild(edgeNode);场景中添加创建的物理节点 |
HelloWorld::addNewSpriteAtposition(Point p) auto sprite = Sprite::create( "circle.png" //创建精灵 sprite->setTag( 1 //设置精灵的便签值 auto body = PhysicsBody::createCircle(sprite->getContentSize().wIDth / //创建一个附加在精灵身体上的圆形物理body sprite->setPhysicsBody(body); //将创建的body加到精灵身上 sprite->setposition(p); this ->addChild(sprite); //添加精灵 } |
auto contactListener = EventListenerPhysicsContact::create(); contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, ); _eventdispatcher->addEventListenerWithSceneGraPHPriority(contactListener,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">); |
一个body的categoryBitmask和另一个body的ContactTestBitmask的逻辑与的结果不等于0时,接触事件将被发出,否则不发送。
一个body的categoryBitmask和另一个body的CollisionBitmask的逻辑与结果不等于0时,他们将碰撞,否则不碰撞
默认情况下的body属性会进行物理碰撞,但不会发送碰撞检测的信号,也就不会响应碰撞回调函数,这个可以看下默认情况下的掩码值的逻辑与 8
0xFFFFFFFF
;
ContactTestBitmask =
0x00000000
;
categoryBitmask & ContactTestBitmask =
0
CollisionBitmask =
;
categoryBitmask & CollisionBitmask =
0xFFFFFFFF
所以物体会碰撞,但是不会响应碰撞回调函数。
以上是内存溢出为你收集整理的cocos2d-x 3.2 物理碰撞机制全部内容,希望文章能够帮你解决cocos2d-x 3.2 物理碰撞机制所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)