深秋

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

          创建工程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

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

posted on 2014-08-01 13:20  深秋  阅读(914)  评论(0编辑  收藏  举报