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

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

2016-07-06 22:50 513 查看
//头文件

#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); 
//˝ 摩擦力 0~1
,0为没有摩擦力
        fixture->SetRestitution(0.5f);
// 弹力 0~1  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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: