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、创建物理世界
创建一个与场景一样大小的物理世界
6、载入物体
其他元素载入方法类似。全部载入完成之后就可以体验box2d的物理小游戏了。
7、下载地址
小球源代码
下面以一个物理游戏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、下载地址
小球源代码
相关文章推荐
- cocos2dx使用TiledMap创建斜45度地图场景
- 如何使用 PhysicsEditor 加快 cocos2dx-Box2D 开发
- 如何使用 PhysicsEditor 加快 cocos2dx-Box2D 开发
- cocos2dx 3.x使用Box2d
- Cocos2dx杂记:box2d初探
- 如何使用 PhysicsEditor 加快 cocos2dx-Box2D 开发
- box2d系列:如何使用 PhysicsEditor 加快 cocos2dx-Box2D 开发
- Libgdx Box2D实战---放开那小球(四:不规则body创建--physics-body-editor的使用)
- 【COCOS2DX-BOX2D游戏开发之三】 读取tiledmap的tmx阻挡
- cocos2dx使用BOX2D
- 如何使用 PhysicsEditor 加快 cocos2dx-Box2D 开发
- cocos2dx box2d使用(一)
- cocos2dx-3.0 中的物理引擎Box2D使用(二)
- cocos2dx使用TiledMap创建斜45度地图场景
- Cocos2dx中Box2D的简单使用
- 【COCOS2DX-BOX2D游戏开发之三】 读取tiledmap的tmx阻挡
- cocos2dx之box2d的使用
- cocos2dx-3.0 中的物理引擎Box2D使用(四)
- cocos2dx自学之使用box2d物理世界
- cocos2dx使用TiledMap创建斜45度地图场景