上一篇講了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)