quick-cocos2d-x物理引擎之chipmunk(一)

chipmunk是一個用C寫成的物理引擎,quick-cocos2d-x已經用C++對其進行封裝,導出到lua的類有: node

CCPhysicsWorld
CCPhysicsBody
CCPhysicsShape
CCPhysicsDebugNode
CCPhysicsCollisionEvent
CCPhysicsVector

能夠看出,quick-cocos2d-x沒有對joint(鏈接)進行封裝,下面將就如何在quick-cocos2d-x中使用chipmunk做詳細的介紹。

1、簡介
一、World,Body,Shape可用下圖說明其關係

能夠看出,World由Body組成,而Body又由Shape組成。就像咱們所處的世界同樣,世界由房屋,樹木等等構成,而房屋由門窗,牆壁等組成,樹木由葉子,樹幹,樹枝等組成。
二、CCPhysicsDebugNode
是用於顯示各個物體的邊框等等信息,主要用於調試。
三、CCPhysicsCollisionEvent
是物體之間發生碰撞時產生的事件,事件中攜帶有碰撞時的信息。
四、
CCPhysicsVector則是向量,物體受力時將會用到。

2、使用流程

一、創建World
咱們要使用chipmunk,首選要創建一個世界(CCPhysicsWorld)
app

-- 創建沒有引力的世界
CCPhysicsWorld:create()
-- 指定兩個方向上的引力
CCPhysicsWorld:create(gravityX, gravityY)
示例:
-- 引力向下的世界(跟地球相似)
self.world=CCPhysicsWorld:create(0,-200)
self:addChild(self.world)
二、創建Body
在chipmunk裏,Body分爲兩種:static和非static(普通),static是固定不動的;形狀上能夠分爲長(正)方形、圓形、多邊形和自定義類型,創建它們的方法也不少。
1)能夠經過Word裏的方法建立:
-- 當mass<=0時會建立一個StaticBody
World:createBoxBody(mass, width, height)
-- offset爲偏移量
World:createCircleBody(mass, radius, offsetX, offsetY)
-- vertexes格式爲{x1, y1, x2, y2, x3, y3},目前的版本有bug,不能夠設置offset
World:createPolygonBody(mass, vertexes, offsetX, offsetY)
示例:
local body = self.world:createBoxBody(10, 100, 100)
local body = self.world:createCircleBody(0, 20, 50, 50)
-- 建立一個三角形
local vertexes = {0,0,50,50,100,0}
local body=self.world:createPolygonBody(0, vertexes)
2)經過Body裏的方法建立:
CCPhysicsBody:createStaticBody(world)
CCPhysicsBody:create(world, mass, moment)
示例:
local body = CCPhysicsBody:createStaticBody(self.world)
-- 這種建立方式要記得把body放到world裏
self.world:addBody(body)
3)重要屬性或方法:
-- 摩擦係數 0-1.0
body:setFriction(friction)
-- 反彈係數 0-1.0
body:setElasticity(elasticity)
-- 是不是感應
body:setIsSensor(isSensor)
body:isSensor()
-- 速度
body:setVelocity(velocityX, velocityY)
-- 角速度
body:setAngleVelocity(velocity)
-- 推力
body:applyForce(forceX, forceY, offsetX, offsetY)
body:applyForce(force, offsetX, offsetY)
body:applyImpulse(forceX, forceY, offsetX, offsetY)
body:applyImpulse(force, offsetX, offsetY)
4)刪除
-- unbind=true時將解除綁定的CCNode,但不會從場景裏刪除node,只是執行CC_SAFE_RELEASE_NULL(node);
-- unbind=false時CCNode將繼續綁定在該Body上,默認爲true
body:removeSelf(unbind)
World:removeBody(body, unbind)
World:removeBodyByTag(tag, unbind)
三、創建Shape
Shape要放置於Body中,通常狀況下是不須要單獨再創建Shape的,上面建立Body的時候不少就已經建立有一個Shape了
當一個Body由多個獨立的部分組成時(好比一我的由頭部,手,腳,身體組成),則要經過建立多個Shape來完成了。

1)Shape
的建立都是由Body的方法來完成。
-- 線段,lowerLeft和lowerRight爲CCPoint,thickness爲粗細
Body:addSegmentShape(lowerLeft, lowerRight, thickness)
Body:addCircleShape(radius, offsetX, offsetY)
Body:addBoxShape(width, height)
-- 目前好像不能運行,已發issue到官方倉庫
Body:addPolygonShape(vertexes, offsetX, offsetY)

2)Shape的屬性 ui

-- 摩擦係數 0-1.0
shape:setFriction(friction)
-- 反彈係數 0-1.0
shape:setElasticity(elasticity)
-- 是不是感應
shape:setIsSensor(isSensor)
shape:isSensor()
3)刪除
body:removeShape(shapeObject)
body:removeShapeAtIndex(index)
body:removeAllShape()
四、綁定
以前咱們都只是創建物理世界裏的物體,並無把它們同外觀聯繫起來,好比把一個Box同一張箱子的圖片結合在一塊兒,這個就叫作綁定,在quick-cocos2d-x裏能夠經過
-- node爲CCNode類型
Body:bind(node)
Body:unbind()
來完成綁定和解綁。
五、調試
很簡單,只要加入如下代碼便可:
self.worldDebug=self.world:createDebugNode()
self:addChild(self.worldDebug)


以上就是quick-cocos2d-x中使用chipmunk的過程,有些成員方法沒有一一指出,你們可自行翻看源碼來了解。下一篇我將會講到碰撞部分 lua

相關文章
相關標籤/搜索