Box2D 和 Chipmunk2D 是以往 cocos2d 中两款常用的物理引擎,这两个物理引擎精确的说是刚体物理仿真库,这里的物理就是刚体动力学。而我们在谈到这物理引擎的时候,经常会听到刚体(Rigid body)。那什么是刚体?刚体就是在任何外力的作用下,体积和形状都不发生改变的物体。动力学又是什么?动力学是计算刚体在受力作用下随时间移动并相互作用的一个过程。Box2D和Chipmunk2D两个引擎的建构理论基础当然基于此。
- PhysicsWorld 是 cocos2d 封装的一个用于模拟真实“物理世界”的类。
- 一个 PhysicsWorld 对象,用于模拟物理碰撞和其他物理行为。你不需要直接创建PhysicsWorld对象;相反,你可以从一个场景对象获取它。
简介
通常,我们通过Scene::create()创建的场景不是基于物理世界的场景。而使用Scene::createWithPhysics()创建场景时,那么这样创建的场景将是基于物理世界的。
PhysicsWorld
- 设置物理世界的重力值
void setGravity(const Vec2 &gravity);
- 设置更新物理世界的子步骤的数量。
void setSubsteps(int steps);
- 设置物理世界的仿真执行速度
void setSpeed(float speed);
- 获得物理世界的刚体
PhysicsBody * getBody(int tag);
const Vector< PhysicsBody * > & getAllBodies();
- 移除一个物理刚体
virtual void removeBody(PhysicsBody *body);
virtual void removeBody(int tag);
- 获得指定坐标上的物理形状
Vector< PhysicsShape * > getShapes (const Vec2 &point);
- 获得指定坐标上最近的物理形状
PhysicsShape * getShape(const Vec2 &point);
- 设置物理世界的调试绘制掩码 : 显示物理世界调试状态,显示红色的框,方便调试
void setDebugDrawMask(int mask);
DEBUGDRAW_NONE :什么都不绘制
DEBUGDRAW_SHAPE :绘制形状
DEBUGDRAW_JOINT :绘制关节
DEBUGDRAW_CONTACT :绘制碰撞
DEBUGDRAW_ALL : 都绘制
- 控制物理迭代的方法
void setAutoStep(bool autoStep);
// 如果设置False的话,那么setSpeed和setSubsteps,以及setUpdateRate函数都不能正常工作了
// 如果为false,那么刚体将停止不动。
- 物理世界的默认属性
_gravity(Vec2(0.0f, -98.0f)) : 98cm/s2
, _speed(1.0f)
, _updateRate(1)
, _updateRateCount(0)
, _updateTime(0.0f)
, _substeps(1)
, _cpSpace(nullptr)
, _updateBodyTransform(false)
, _scene(