cocos2d-x 中box2d的简单使用,代码来自传智播客c++课程 。

//头文件

#include "external/Box2D/Box2D.h"

#define      PTM_RATIO 32.0  //这个值越大运动的越快 32是课程代码中的默认值


//创建b2wold

void kzwB2BodySecenc::crateB2Box(){

//获得屏幕的尺寸

    Size winSize=Director::getInstance()->getWinSize();

  //设置重力,y轴方向为9.8 模仿真实的世界

    b2Vec2 gra(0,9.8);

//创建box2d世界

    _world=new b2World(gra);

    {

        b2BodyDef def;

//设置类型 接受重力的影响

        def.type = b2_dynamicBody;

//设置起始位置,为中点

        def.position.Set(winSize.width / 2/PTM_RATIO, winSize.height / 2/PTM_RATIO);

 //创建body物体        

        b2Body* body = _world->CreateBody(&def);

        

        // 设置物体的受力

        body->SetLinearVelocity(b2Vec2(10, 20));

        

        //创建精灵

        Sprite* sprite = Sprite::create("CloseNormal.png");

        addChild(sprite);

        sprite->setPosition(body->GetPosition().x*PTM_RATIO, body->GetPosition().y*PTM_RATIO);

        

        // 设置物体为圆形

        b2CircleShape shape;

//半径大小

        shape.m_radius = sprite->getContentSize().width / 2 / PTM_RATIO;

        

        b2Fixture* fixture = body->CreateFixture(&shape, 1.0f /*√‹∂»œµ ˝*/);

        fixture->SetFriction(0.5f);  // 

        fixture->SetRestitution(0.5f); //

        

        // 设置关联对象,方便找到sprite对象

        body->SetUserData(sprite);

    }

    

    //   下边界 

    {

        b2BodyDef def;

        // def.position.Set(0, 0);

        

        b2Body* body = _world->CreateBody(&def);

        b2EdgeShape shape;

        shape.Set(b2Vec2(0, 0), b2Vec2(winSize.width / PTM_RATIO, 0));

        

        b2Fixture* fixture = body->CreateFixture(&shape, 1.0f);

        

        fixture->SetFriction(0.5f);  //˝ 摩擦力 01 0为没有摩擦力

        fixture->SetRestitution(0.5f); // 弹力 01  1.0 完全弹力

    }

    

    //上边界

    {

        b2BodyDef def;

        def.position.Set(0, winSize.height/PTM_RATIO);

        

        b2Body* body = _world->CreateBody(&def);

        b2EdgeShape shape;

        shape.Set(b2Vec2(0, 0), b2Vec2(winSize.width / PTM_RATIO, 0));

        

        b2Fixture* fixture = body->CreateFixture(&shape, 1.0f);

        

        fixture->SetFriction(0.5f);  // ƒ¶≤¡œµ ˝

        fixture->SetRestitution(0.5f); // µØ–‘œµ ˝

    }

    

    //  左边界

    {

        b2BodyDef def;

        //def.position.Set(0, winSize.height / PTM_RATIO);

        

        b2Body* body = _world->CreateBody(&def);

        b2EdgeShape shape;

        shape.Set(b2Vec2(0, 0), b2Vec2(0, winSize.height/PTM_RATIO));

        

        b2Fixture* fixture = body->CreateFixture(&shape, 1.0f);

        

        fixture->SetFriction(0.5f);  // ƒ¶≤¡œµ ˝

        fixture->SetRestitution(0.5f); // µØ–‘œµ ˝

    }

    

    //   右边界

    {

        b2BodyDef def;

        def.position.Set(winSize.width / PTM_RATIO, 0);

        

        b2Body* body = _world->CreateBody(&def);

        b2EdgeShape shape;

        shape.Set(b2Vec2(0, 0), b2Vec2(0, winSize.height / PTM_RATIO));

        

        b2Fixture* fixture = body->CreateFixture(&shape, 1.0f);

        fixture->SetFriction(0.5f);  // ƒ¶≤¡œµ ˝

        fixture->SetRestitution(0.5f); // µØ–‘œµ ˝

    }

    

    scheduleUpdate();


    

    

}


//定时器回调

void kzwB2BodySecenc::update(float dt) {

    //  世界开始计时 运行

    _world->Step(dt, 8, 1);

    // 遍历body对象

    b2Body* body = _world->GetBodyList();

    while (body)

    {

        // 找到与body关联的sprite

        Sprite* sprite = (Sprite*)body->GetUserData();

        if (sprite)

        {

            sprite->setPosition(body->GetPosition().x*PTM_RATIO, body->GetPosition().y*PTM_RATIO);

            sprite->setRotation(body->GetAngle()*180.0/M_PI);

        }

        

        body = body->GetNext();

    }

}

void kzwB2BodySecenc::onExit(){

//推出界面释放_world对象

    delete _world;

    _world=nullptr;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值