Cocos2d 自带了两套物理引擎:Box2D 和 Chipmunk。那么我们应该选择哪一个呢?
很多情况下,这个选择取决于个人口味。很多游戏开发者对这两个物理引擎的 争论集中于它们所用的编程语言:Box2D 是用 C++写的,而 Chipmunk 用的是 C。
你可能因为 C++接口而更喜欢 Box2D。使用 C++的好处是它可以很好地与同样是 面向对象的 Objective-C 进行整合。而且 Box2D 中的变量和方法名都是用全称 命名的,相比之下,Chipmunk 中很多地方用的是只有一个字母的简写。
再者, Box2D 中使用了运算符重载(Operator Overloading),例如,你可以将两个 矢量(vector)直接相加:
b2Vec2 newVec = vec1 + vec2;
有一些功能只有Box2D提供,Chipmunk是没有的。比如,Box2D有针对快速移动 物体(例如子弹)直接穿透物体而不进行碰撞测试的解决方法。
本文使用的物理引擎是Box2D。
Box2D的作者是 Erin Catton ,具体的信息可以去网上搜索。感谢作者。
好的,下面进入正题,介绍下Box2D这个将要使用的物理引擎。
Box2D可以在任何具有C++编译器的平台上面使用。该引擎支持定点和浮点模式编译,在多种移动平台上面都都可以使用,如 Nintendo DS 、Wii 、iPhone、ipad、android、Windows phone 7 等。该引擎目前有多个编程语言和环境的移植版,包括Java、Adobe Flash、C#、JavaScript等主流语言和平台。
Box2D可以进行刚体物理仿真,包括仿真凸多边形、圆形和方形物体。Box2D 中的物体使用关节(joints)连接,并使用力(forces)施加相互作用。它还支持重力、摩擦力和弹性等。
刚体(rigid body)是非常坚硬的物体,其在Box2D世界中任何碰撞都不会改变它的形态。
约束(constraint)是消除物体自由度的物理连接,自由度在2D世界比较简单,只有横、纵坐标和角度。
接触约束(contact constraint)用于防止刚体穿透,同时模拟摩擦和弹性回复,Box2D自动设置。
关节(joints)是用于将2个或以上的物体进行组装的枢纽,就像是生活中的螺丝钉。
关节制动(joint limit)限定了关节的活动角度,就是螺丝 可能只能转半圈。
关节马达(joint motor)可以按照关节的自由度来驱动所连接的物体。
关节定义(joint definition)在创建关节之前,必须创建一个定义。
note:关节连接的2个物体,不可都为静态物体。
关节工厂是使用世界类的工厂方法来创建和销毁的。
世界类(b2World)是物体(b2Body),夹具(b2Fixture)和各类关节(joints)相互作用的集合。
求解器(solver)用于解决模拟中的约束。一次一个。
物体类(b2Body)拥有位置和速度,可以在物体上应用力、扭矩和冲量。物体分为静态物体、kinematic和动态物体。静态物体永远不会移动并且不会与其他的静态物体或者kinmatic物体发生碰撞。
物体定义(b2BodyDef)是在创建物体前定义的,就像生成一个物体之前,各项属性需要提前设置。
物体工厂方法是在Box2D中用于物体的创建和销毁,这使得世界类可以高效管理物体。
note:永远不要使用new 或 malloc 来创建物体。
子弹(bullet)是指高速移动的物体。
形状类(b2Shape)是物体类的属性,一个物体可以i拥有多个形状。
夹具类是用与将形状和物体绑定在一起。
夹具定义(b2FixtureDef),在创建定义后,可以指定属性、形状、密度、摩擦力、弹性系数、碰撞筛选标识、到父物体的指针、用户自定义数据和传感器标识。
碰撞筛选属于夹具定义的子类。
接触(contact)是Box2D创建的用于管理形状间碰撞的对象。
接触点(contact point)是2个形状相互接触的点。
接触向量(contact normal)是从一个形状到指向另一个形状的单位向量。
接触监听器(b2ContactListener)来获取接受数据。
调试绘图。
模块(Modules)分别为常规、碰撞和动态。常规负责的是内存分配、数学计算和相关设置;碰撞负责的是定义形状和粗测;而动态模块负责的虚拟的世界、物体和夹具 、关节。
单位是浮点数运算 。
三、Box2D Demo的解读
PhysicalSprite 类的作用是定义一个和Box2D 世界物体绑定在一起的精灵对象。