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

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

2017-02-22 13:12 253 查看
前面介绍了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、星
4000
星(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、下载地址

小球源代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: