Cocos2d-x 3.x(Quick 3.x同样)版本中封装了一个全新的 Physics 接口,物理世界被融入到 Scene 中,即当创建一个场景时,可以指定这个场景是否使用物理引擎。
如:创建一个带物理引擎的游戏场景
display.newPhysicsScene("GameScene")
self.world = self:getPhysicsWorld()
self.world:setGravity(cc.p(0, -98.0))
self.world:setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL)
self:getPhysicsWorld()
用来获取场景绑定的物理世界对象。
获取的 self.world 默认是有带重力的,大小为(0.0f, -98.0f), 但我们也可以通过的setGravity()方法来改变重力大小。
setDebugDrawMask 方法是在调试物理世界时使用的,该方法可以开启调试模,能把物理世界中不可见的body,shape,joint等元素可视化。当调试结束时,需要把该功能关闭。
然后创建一个带物理特性的游戏角色。
引擎封装了 Physics 接口后,Node 就自带了 body 属性,也就是每个 Sprite 都自带了 body 属性。所以我们要创建一个可受重力作用的 Sprite 是非常容易的,下面我们在游戏角色中加入如下的一段代码就可以为它绑定一个 body:
local body = cc.PhysicsBody:createBox(self:getContentSize(), cc.PHYSICSBODY_MATERIAL_DEFAULT, cc.p(0,0))
self:setPhysicsBody(body)
这里调用cc.PhysicsBody:createBox()
方法创建了一个矩形的 body,createBox 方法有三个参数,分别是:
- 参数1为 cc.size 类型,它表示矩形 body 的尺寸大小。
- 参数2为 cc.PhysicsMaterial 类型,表示物理材质的属性,默认情况下为 cc.PHYSICSBODY_MATERIAL_DEFAULT。 该参数也可自定义,方法如下:
cc.PhysicsMaterial(density, restitution, friction)
- density:表示密度
- restitution:表示反弹力
- friction:表示摩擦力
- 例:(密度,反弹力、摩擦力都设为0是为了在碰撞的时候不发生任何物理形变)
-
local MATERIAL_DEFAULT = cc.PhysicsMaterial(0.0, 0.0, 0.0)
-
local airshipBody = cc.PhysicsBody:createCircle(airshipSize.width / 2, MATERIAL_DEFAULT)
- 参数3为 cc.p 类型,它也是一个可选参数,表示 body 与中心点的偏移量&#