Box2D的一些概念和笔记

cocos2d-x 3.0 对物理引擎的支持有了重大的更新,物理引擎被 集成到游戏引擎中,使用者无需再直接调用Box2D或Chipmunk的API ,详情请阅:

--------------------------------------------------------------------
下面时cocos2d-x 2.x的例子
---------参照实例:TestCpp/Classes/Box2DTest
---------Box2D的物理世界(树状,创建时确定从属关系)
b2World:一个物理世界,所有的刚体都将存在在这个世界里面,这个世界以米为距离单位。尽量贴近真实世界的度量。
b2Body:刚体,存在在物理世界的理想物体,比任何物体都硬,不会发生形变。body对应着一个bodyDef(刚体定义),刚体定义指定了刚体的类型(动态、静态、轨迹运动的)和刚体的位置,world通过刚体定义创建刚体。
b2Fixture:刚体修饰物,描述刚体的一些特征。fixture对应着fixtureDef(修饰物定义),它将形状绑定到刚体上,使刚体具有一些表现特征,如密度、摩擦系数、弹性等等。body通过fixtureDef创建fixture。
b2Shape:一个几何形状,比如圆和多边形。形状是修饰物fixture的一个属性,描述了刚体的碰撞边界。
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);
}

-------碰撞检测
继承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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值