cocos2d-x中集成了Box2D引擎,在Visual Studio中,可以选定工程,按Alt + Enter,在弹出的菜单中,选择C/C++ -->Preprocessor -->Preprocessor Definitions,将Preprocessor Definitions中的CC_ENABLE_CHIPMUNK_INTEGRATION=1改成CC_ENABLE_BOX2D_INTEGRATION=1即可启用Box2D引擎。
以下是关于如果在一个虚拟物理世界中创建一个刚体的几个步骤的简单总结:
创建刚体可以分为六个步骤:
1、world,创建一个物理世界
b2Vec2 gravity = b2Vec2(0, -10.f);
b2World *world = new World(gravity);
world->setAllowSleeping(true);//是否允许睡眠
2、body definition,刚体定义
通过b2BodyDef对象,定义一个刚体的属性
b2BodyDef groundBodyDef;
//刚体位置,其中PTM_RATIO是一个宏常量。设定像素/米的比例
groundBodyDef.position.Set(100.f / PTM_RATIO, 100.f / PTM_RATIO);
groundBodyDef.type = b2_staticBody;//静态刚体还是动态刚体
groundBodyDef.userData = sprite;//将精灵与刚体绑定
3、body,通过世界创建一个刚体
b2Body groundBody = world->CreateBody(&groundBodyDef);
4、shape,创建刚体的形状
//实心四边形形状
b2PolygonShape rectShape;
//注意SetAsBox方法的参数分别为半宽、半高
rectShape.SetAsBox(sprite->getContentSize().width / 2 / PTM_RATIO,
sprite->getContentSize().height / 2 / PTM_RATIO));
5、fixture definition。fixture有人说是夹具,有人说是框架。各有所爱吧,本人更偏向于夹具这个形象的说法。
刚体的夹具定义,将形状附着在夹具上(fixture.shape = shape)
b2FixtureDef groundFixtureDef;
groundFixtureDef.shape = &rectShape;
groundFixtureDef.density = 1.f;//刚体密度
groundFixtureDef.friction = 0.f;/刚体摩擦力
groundFixtureDef.restitution = 0.f;//刚体的反弹系数
//传感器模式。如果为true,则与其他刚体碰撞时,该刚体不会自动产生碰撞反应
//即可穿过其他刚体
//如果为false,则会自动产生碰撞反应,默认为false
groundFixtureDef.isSensor = true;
6、fixture,通过body创建一个fixture
//注意此处的Fixture要通过Body对象来创建,而不是通过World对象来创建
b2Fixture *groundFixture = groundBody->CreateFixture(&groundFixtureDef);
最后在CCLayer或CCScene的onExit()方法中,要释放世界资源。
即加上delete world;语句