上一篇讲了quick-cocos2d-x使用chipmunk的使用流程,介绍了World,Body,Shape的创建,这一篇将讲解如何处理物体之间的碰撞。
1、监听事件
quick-cocos2d-x中的chipmunk碰撞处理是经过监听事件来实现的。 函数
-- 设置物体的碰撞类别,默认全部物体都是类别0 Body:setCollisionType(type) -- handle是一个回调函数,碰撞处理将在这个函数中执行 -- collisionTypeA和collisionTypeB是两个int值,表示要监听的是哪两种物体 -- 这两个值在body中设置(上面所示的方法),两个值相同时为监听同种物体之间的碰撞 World:addCollisionScriptListener(handler, collisionTypeA, collisionTypeB) -- handler回调函数,这个函数必定要返回true,否则碰撞后两个物体将会重合,即像是不碰撞同样 -- eventType为碰撞的类别,有四种值: -- begin 开始碰撞 -- preSolve 持续碰撞(相交),能够设置相交时独自的摩擦,弹力等 -- postSolve 调用完preSolve后,作后期处理,好比计算破坏等等 -- separate 分开,当删除一个shape时也会调用 -- event为CCPhysicsCollisionEvent实例 onCollisionListener(eventType, event)示例:
body:setCollisionType(1) self.world:addCollisionScriptListener(handler(self, self.onCollisionListener), 1, 2) function PhysicsScene:onCollisionListener(eventType, event) print(eventType) return true end
-- 获取CCPhysicsWorld event:getWorld() -- 获取两个碰撞的body event:getBody1() event:getBody2() -- 是不是两种物体第一次接触 event:isFirstContact() -- 弹性系数,在preSolve以前设置可改变当前值 event:setElasticity(elasticity) event:getElasticity() -- 摩擦系数,在preSolve以前设置可改变当前值 event:setFriction(friction) event:getFriction() -- 碰撞时两物体的接触点数 event:getCount() -- 获取接触点 event:getPoint(index)
-- body所在的碰撞层,默认值为0,同层的物体才会发生碰撞 -- layers能够表示多个层,具体怎么达到的呢 -- 当咱们对一个物体分层时,所用的数字应该为[1,2,4,8,16,32,...]这样形式(倍增)来分 -- 如A为1,B为2,C为4,即为基本层(layer),若是要求C可与A碰撞,则C的layers为1+4=5 Body:setCollisionLayers(layers) -- body所在组,默认值为0,同个组的将不发生碰撞(除了0组) -- 优先级高于layer,当group不同的时候才会考虑layers Body:setCollisionGroup(group)从上面咱们能够得出:
-- 为了程序清晰,layers不用求和 A:setCollisionLayers(1) B:setCollisionLayers(2) C:setCollisionLayers(1+2+4+8) D:setCollisionLayers(1+2+4+8) A:setCollisionGroup(1) B:setCollisionGroup(2) C:setCollisionGroup(3) D:setCollisionGroup(4)