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

相关文章
相关标签/搜索