cocos2d-x 3.0 对物理引擎的支持有了重大的更新,物理引擎被
集成到游戏引擎中,使用者无需再直接调用Box2D或Chipmunk的API
,详情请阅:
--------------------------------------------------------------------
下面时cocos2d-x 2.x的例子
---------参照实例:TestCpp/Classes/Box2DTest
---------Box2D的物理世界(树状,创建时确定从属关系)
b2Body:刚体,存在在物理世界的理想物体,比任何物体都硬,不会发生形变。body对应着一个bodyDef(刚体定义),刚体定义指定了刚体的类型(动态、静态、轨迹运动的)和刚体的位置,world通过刚体定义创建刚体。
b2Fixture:刚体修饰物,描述刚体的一些特征。fixture对应着fixtureDef(修饰物定义),它将形状绑定到刚体上,使刚体具有一些表现特征,如密度、摩擦系数、弹性等等。body通过fixtureDef创建fixture。
b2Shape:一个几何形状,比如圆和多边形。形状是修饰物fixture的一个属性,描述了刚体的碰撞边界。
b2Vec2:一个二维向量,可用于表示力、点等。
b2Vec2:一个二维向量,可用于表示力、点等。
-------b2World, b2Body, b2BodyDef, b2Fixture, b2FixtureDef, shpae之间的关系
1.b2World通过b2BodyDef创建b2Body,没有b2BodyDef,b2Body不知道是什么类型,放在世界什么位置。2.b2Body通过b2FixtureDef创建b2Fixture,没有b2Fixture,b2Body不知道是什么形状,摩擦、弹性、密度都不知道。shpae提供了碰撞检测的外边框。
-------需要手动关联物理世界和游戏中的元素(精灵)
void Box2DTestLayer::update(float dt)
{
int velocityIterations = 8;
int positionIterations = 8;
world->Step(dt, velocityIterations, positionIterations);
}
{
int velocityIterations = 8;
int positionIterations = 8;
world->Step(dt, velocityIterations, positionIterations);
}
-------碰撞检测
继承b2ContactListener接口
设置b2Word的碰撞监听器:world->SetContactListener(this);
实现4个事件回调(分别对应碰撞检测前后,碰撞处理前后):
virtual void BeginContact(b2Contact* contact) ;
virtual void EndContact(b2Contact* contact) ;
virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);
virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);
-------调试绘图(TestCpp/Box2DTest注释了该部分代码,可以参考)
复制TestCpp/Classes的Box2DTestBed/GLES-Render.h和Box2DTestBed/GLES-Render.cpp到Classes目录下
初始化GLESDebugDraw
重写draw()方法
-------
#define PTM_RATIO 32 //代表32个像素是一米
用到Box2D的linux工程编译,解决找不到Box2D/Box2D.h的问题:
修改make文件:
INCLUDES = -I.. -I../Classes \
-I$(COCOS_ROOT)/external/ \
SHAREDLIBS += -lcocos2d -lbox2d
-I$(COCOS_ROOT)/external/ \
SHAREDLIBS += -lcocos2d -lbox2d