首页 > 代码库 > 15--Box2D使用(一、创建物理世界)

15--Box2D使用(一、创建物理世界)

          创建工程Box2DTest,去掉背景和精灵对象等。首先在HelloWorldScene.h头文件定义一个屏幕像素与物理世界长度转换宏,并引入box2D头文件

    #define PIXEL_TO_METER 30     #include "Box2D/Box2D.h"

          再声明几个函数与变量

    void createWorld();  //创建物理世界    void createWall();   //创建四周墙体    void createBall();   //创建刚体
 

     b2World* world;
    b2Body* wallBody ;

    float32 wallLineOffset ;

        createWorld实现

void HelloWorld::createWorld(){    b2Vec2 gravity;    gravity.Set(0.0f,-9.0f);   //物理世界重力向量,这里创建一个向下的重力向量    b2BodyDef* bodydef = new b2BodyDef();    world = new b2World(gravity);    //根据重力向量创建物理世界对象    world->SetAllowSleeping(true);   //允许休眠        world->SetWarmStarting(true);    //初始状态将受到重力影响}

         createWall实现

void HelloWorld::createWall(){    CCSize s = CCDirector::sharedDirector()->getVisibleSize();    b2BodyDef wallDef ;   //刚体定义    wallDef.position.Set(0,0);  //位置    wallBody = world->CreateBody(&wallDef);   //创建一个刚体(四周墙体)    b2EdgeShape wallShape;   //形状    //下   wallLineOffset 方便调整显示位置    wallShape.Set(b2Vec2(0,0+wallLineOffset), b2Vec2(s.width/PIXEL_TO_METER,0+wallLineOffset));  //设置形状大小    wallBody->CreateFixture(&wallShape,0);   //将形状连接到框架上    //    wallShape.Set(b2Vec2(0,s.height/PIXEL_TO_METER-wallLineOffset),b2Vec2(s.width/PIXEL_TO_METER,s.height/PIXEL_TO_METER-wallLineOffset));    wallBody->CreateFixture(&wallShape,0);    //    wallShape.Set(b2Vec2(0+wallLineOffset,s.height/PIXEL_TO_METER),b2Vec2(0+wallLineOffset,0));    wallBody->CreateFixture(&wallShape,0);    //    wallShape.Set(b2Vec2(s.width/PIXEL_TO_METER-wallLineOffset,s.height/PIXEL_TO_METER),b2Vec2(s.width/PIXEL_TO_METER-wallLineOffset,0));    wallBody->CreateFixture(&wallShape,0);}

       createBall实现

void HelloWorld::createBall(){    CCSize s = CCDirector::sharedDirector()->getVisibleSize();    for(int i= 0; i < 5; i++)    {        b2BodyDef ballDef ;        ballDef.type = b2_dynamicBody;  //设置刚体为动态物体        b2CircleShape circleShape ;    //刚体碰撞使用的形状        b2FixtureDef ballFixtureDef ;        circleShape.m_p.Set(1.0+i,5.0);        circleShape.m_radius= 0.5f;        //刚体连接的框架设置        ballFixtureDef.shape = &circleShape;         ballFixtureDef.density = 1.0;        ballFixtureDef.restitution = 0.8;    //设置重力恢复系数        ballFixtureDef.friction = 0.3f;        ballDef.position.Set(s.width/2/PIXEL_TO_METER,20/PIXEL_TO_METER);        b2Body* ball = world->CreateBody(&ballDef); //根据刚体定义创建刚体        ball->CreateFixture(&ballFixtureDef);       //关联框架到刚体上    }}

        最后再init方法中添加如下代码

wallLineOffset = 0.5;    this->createWorld();    this->createWall();    this->createBall();

       最后我们运行看看什么情况

image

        呵呵,我们创建的物体世界没有显示出来,下一篇中我们把物理世界显示出来。