Cocos2dx杂记:推小球,box2d与TiledMap的使用

前面介绍了box2d和tiledmap
下面以一个物理游戏Demo为例来介绍下box2d与TiledMap基本使用方式

1、Demo运行截图(Demo素材收集与网络,如有侵权请告知删除

这里写图片描述

2、游戏功能介绍

点击蓝色的物体变成小球把红色的球推下去,并且吃掉场景中的星星,右面三角形的是跷跷板,没什么作用,大家当做不存在就好。。。

3、目录结构

这里写图片描述
Constants.h 中定义了像素和米数的比
GLES-Render.h 显示box2d调试效果
HelloWorldScene.h主要方法

4、载入地图

整个游戏场景属性是使用TiledMap编辑的,编辑完成后载入,相关TiledMap操作可以参见
Cocos2dx杂记:Tiledmap读取

首先看一下Tiled的设计结构(图片中高亮的部分就是当前层的对象

(1)结构
这里写图片描述

(2)层
a、背景层(背景)
这里写图片描述
b、敌人(enemy)
这里写图片描述
c、玩家操作单位(player)
这里写图片描述
d、物理路径(phy)
这里写图片描述
e、星星(stars)
这里写图片描述
f、木头等障碍物(wood)
这里写图片描述

整个场景在Tiled中设计好之后,载入。

5、创建物理世界

创建一个与场景一样大小的物理世界

bool HelloWorld::initPhysics() {
    Size s = Director::getInstance()->getVisibleSize();

    //重力参数  
    b2Vec2 gravity;
    //重力,1个g
    gravity.Set(0.0f, -9.8f);
    //创建世界  
    world = new b2World(gravity);
    //开启调试
    openDebugDraw();

    //允许物体是否休眠  
    world->SetAllowSleeping(true);
    //开启连续物理测试  
    world->SetContinuousPhysics(true);
    //地面物体定义  
    b2BodyDef groundBodyDef;
    //左下角  
    groundBodyDef.position.Set(0, 0);
    //创建地面物体  
    b2Body* groundBody = world->CreateBody(&groundBodyDef);
    //定义一个有边的形状  
    b2EdgeShape groundBox;
    //底部  
    groundBox.Set(b2Vec2(0, 0), b2Vec2(s.width / PTM_RATIO, 0));
    //使用夹具固定形状到物体上  
    groundBody->CreateFixture(&groundBox, 0);

    //顶部  
    groundBox.Set(b2Vec2(0, s.height / PTM_RATIO), b2Vec2(s.width / PTM_RATIO, s.height / PTM_RATIO));
    groundBody->CreateFixture(&groundBox, 0);

    //左边  
    groundBox.Set(b2Vec2(0, s.height / PTM_RATIO), b2Vec2(0, 0));
    groundBody->CreateFixture(&groundBox, 0);

    //右边  
    groundBox.Set(b2Vec2(s.width / PTM_RATIO, s.height / PTM_RATIO), b2Vec2(s.width / PTM_RATIO, 0));
    groundBody->CreateFixture(&groundBox, 0);

    return true;
}

6、载入物体

//例如:创建木头
//获得木头,从tiled中获得木头的位置等属性,然后将创建木头图片,并且绑定物理属性
    //获得木头
    auto groupWood = map->getObjectGroup("wood");
    auto& objectsWood = groupWood->getObjects();

    for (auto& obj : objectsWood)
    {
        ValueMap& dict = obj.asValueMap();

        float x = dict["x"].asFloat();
        float y = dict["y"].asFloat();
        float width = dict["width"].asFloat();
        float height = dict["height"].asFloat();
        float rotate = dict["rotation"].asFloat();
        //float index = dict["index"].asInt();

        log("rotate = %f", rotate);


        auto sp = Sprite::create();
        sp->setPosition(x, y);
        sp->setScale(0.3f);
        this->addChild(sp, -1);

        sp->initWithFile("aaa/wood.png");
        sp->setRotation(rotate);
        phyObjList.push_back(sp);

        //物体定义  
        b2BodyDef bodyDef;
        bodyDef.type = b2_dynamicBody;
        bodyDef.position.Set(x / PTM_RATIO, y / PTM_RATIO);
        b2Body *body = world->CreateBody(&bodyDef);
        body->SetUserData(sp);
        body->SetTransform(body->GetPosition(), CC_DEGREES_TO_RADIANS(sp->getRotation()));

        b2PolygonShape dynamicBox;
        dynamicBox.SetAsBox(sp->getContentSize().width * 0.3f / 2 / PTM_RATIO, sp->getContentSize().height * 0.3f / 2 / PTM_RATIO);

        // 夹具定义  
        b2FixtureDef fixtureDef;
        //设置夹具的形状  
        fixtureDef.shape = &dynamicBox;
        //设置密度  
        fixtureDef.density = 1.0f;
        //设置摩擦系数  
        fixtureDef.friction = 0.5f;
        //使用夹具固定形状到物体上    
        body->CreateFixture(&fixtureDef);
    }

其他元素载入方法类似。全部载入完成之后就可以体验box2d的物理小游戏了。

7、下载地址

小球源代码

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值