您的位置:首页 > 移动开发 > Cocos引擎

Box2D 物理引擎---创建一个简单的模拟物理世界

2015-10-31 15:39 471 查看
效果展示:




首先:我们进行名词解释:
b2BodyDef 确定位置 包括旋转角度   以及userData
    b2BodyDef bodyDef;
    bodyDef.type =
b2_dynamicBody; //设置动态类型

    bodyDef.position =
b2Vec2(3,
6);//设置位置,单位为米

    b2Body *body =
world->CreateBody(&bodyDef);

    body->SetUserData(ss);
b2PolygonShape和b2CircleShape 作为隐形的形状  包括宽高 
    b2PolygonShape shape;
    shape.SetAsBox(0.5,
0.5);//单位是m


b2FixtureDef  是材料,用来设定密度质量恢复力等
      b2FixtureDef fixtureDef;
    fixtureDef.density =1;//设置密度
    fixtureDef.friction =
0.3;//设置摩擦力
    fixtureDef.shape = &shape;//设置形状
    body->CreateFixture(&fixtureDef);
最后由world->CreateBody(&bodyDef);在世界里创建 b2Body
最后通过  body->CreateFixture(&fixtureDef); 将以及定形的材料加进body中
b2PolygonShape是隐形的形状  通过FixtureDef将其形状做出来(它只是一部分),还要组装b2doy ,

1。初始化物理世界:

void HelloWorld::initWorld(){
world = new b2World(b2Vec2(0, -8));//初始化重力环境

}

2.添加精灵,然后把精灵和世界进行绑定:

void HelloWorld::initSprite(){
//先创建一个精灵:
auto ss = Sprite::create("CloseNormal.png");
this->addChild(ss);
ss->setScale(3, 3);

//用来确定物体的位置,类型(动态。静态);
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position = b2Vec2(5, 6);
b2Body *body = world->CreateBody(&bodyDef);

//指定精灵的形状,这个步骤不能省略,
b2PolygonShape shape;
shape.SetAsBox(ss->getContentSize().width/RATIO, ss->getContentSize().height/RATIO);//单位是m

//材料,用来设置物体的属性(质量,密度,摩擦力,形状,)
b2FixtureDef fixtureDef;
fixtureDef.density =1;
fixtureDef.friction = 0.3;
fixtureDef.shape = &shape; //如果形状为0的话,这个属性是必须的。
body->CreateFixture(&fixtureDef);

body->SetUserData(ss);//物体和世界关联代码:
}



3,对世界中的物体进行实时更新:
void HelloWorld::myupdata(float dt){
world->Step(dt, 8, 3);
Sprite * bird;
//对于动态的物体,我们要实时的更新它的位置和状态。静态的就不用判断了。
for (b2Body *body = world->GetBodyList(); body; body = body->GetNext()) {
if (body->GetType() == b2_dynamicBody) {
bird = (Sprite*)body->GetUserData();
bird->setPosition(Vec2(body->GetPosition().x*RATIO, body->GetPosition().y*RATIO));//设置动态物体的位置

}
}
}



4.上面步骤只是创建了一个可以按照自由落体运动的物体,我们还需要给世界一个边界
void HelloWorld::initGround(){

//地板的位置和类型,(静态)
b2BodyDef bodyDef;
bodyDef.type = b2_staticBody;
bodyDef.position = b2Vec2(0, 0.1);
b2Body *body = world->CreateBody(&bodyDef);

//指定形状,这一步骤必须有
b2PolygonShape groundShape;
groundShape.SetAsBox(960/RATIO, 0.5);
b2FixtureDef fixture;
fixture.density = 1;//密度
fixture.friction = 0.3;//摩擦力
fixture.restitution = 0.8;
fixture.shape = &groundShape;

body->CreateFixture(&fixture);

//设置地板,这里用的是精灵,图片可以自己设定,也可以用UI 进行绘图:
Sprite *sp = Sprite::create("HelloWorld.png");
sp->setAnchorPoint(Vec2(0, 0));
sp->setPosition(Vec2(0, 0));
sp->setScale(3, 0.1);
this->addChild(sp);
body->SetUserData(sp);
}


这样。我们的一个简单的Box模拟物理世界就创建成功了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息