cocos2d-x游戏开发 跑酷(六) 地图循环

转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/22066007

现在人物可以跑动,可以跳跃和下蹲。但是他还是一个孤独的runner,在一片漆黑的世界里跑在一条永无止境的线上。现在给他加上背景和地板,让他跑在一个色彩斑斓的世界。


泰然JS版的跑酷,这个地图是一个自定义class。在C++里面尽量不要自定义一个class,不然你new一个对象,再delete它,虽然也是一样能跑,但是跟引擎风格不一致,看起来感觉怪怪的。


我这里创建一个MapManager继承CCNode,同样给它一个create静态函数和一个init函数,跟引擎结构一样:

主要逻辑是这样的:

1.将背景和地板的锚点设置为左下角,两张连接起来摆放

2.摄像机移动,如果第一张超出摄像机范围,则重载指针指向这个精灵

3.通过重载指针重新设置x轴位置

  1. //  
  2. //  Map.h  
  3. //  Parkour  
  4. //  
  5. //  Created by lerry on 3/25/14.  
  6. //  
  7. //  
  8.   
  9. #ifndef __Parkour__Map__  
  10. #define __Parkour__Map__  
  11.   
  12. #include "cocos2d.h"  
  13. #include "resources.h"  
  14. #include "Box2D/Box2d.h"  
  15. USING_NS_CC;  
  16.   
  17. class MapManager : public CCNode  
  18. {  
  19.     CCLayer* mLayer;  
  20.       
  21.     b2World* mWorld;  
  22.       
  23.     float mMapWidth;  
  24.       
  25.     int mMapCount;  
  26.       
  27.     CCSprite* mMap0;  
  28.       
  29.     CCSprite* mMap1;  
  30.       
  31.     CCSprite* mGround0;  
  32.       
  33.     CCSprite* mGround1;  
  34.       
  35.     int mCurMap;  
  36.       
  37. public:  
  38.       
  39.     MapManager();  
  40.       
  41.       
  42.     static MapManager* create(CCLayer* layer, b2World* world);  
  43.       
  44.     bool init(CCLayer* layer, b2World* world);  
  45.       
  46.     bool chechReloadMap(float eyeX);  
  47. };  
  48.   
  49. #endif /* defined(__Parkour__Map__) */  

看下实现:

  1. //  
  2. //  Map.cpp  
  3. //  Parkour  
  4. //  
  5. //  Created by lerry on 3/25/14.  
  6. //  
  7. //  
  8.   
  9. #include "Map.h"  
  10.   
  11. MapManager::MapManager():mLayer(NULL),mWorld(NULL),mMapWidth(0),mMapCount(2),mMap0(NULL),mMap1(NULL),mGround0(NULL),mGround1(NULL),mCurMap(0)  
  12. {  
  13.       
  14. }  
  15.   
  16.   
  17. MapManager* MapManager::create(cocos2d::CCLayer *layer, b2World *world)  
  18. {  
  19.     MapManager* map = new MapManager();  
  20.     if (map && map->init(layer, world)) {  
  21.         map->autorelease();  
  22.         return map;  
  23.     }else  
  24.     {  
  25.         delete map;  
  26.         map = NULL;  
  27.         return NULL;  
  28.     }  
  29. }  
  30.   
  31. /**传一个主CCLayer,主Layer里面的物理世界*/  
  32. bool MapManager::init(cocos2d::CCLayer *layer, b2World *world)  
  33. {  
  34.     if (!CCNode::init()) {  
  35.         return false;  
  36.     }  
  37.     mLayer = layer;  
  38.     mWorld = world;  
  39.       
  40.     // 两张背景,两张地板  
  41.     mMap0 = CCSprite::create(map0);  
  42.     mMap1 = CCSprite::create(map1);  
  43.     mGround0 = CCSprite::create(ground0);  
  44.     mGround1 = CCSprite::create(ground1);  
  45.       
  46.     // 背景0,设置锚点左下角  
  47.     mMap0->setAnchorPoint(ccp(0, 0));  
  48.     mMap0->setPosition(ccp(0, 0));  
  49.     mLayer->addChild(mMap0);  
  50.       
  51.     // 地板0,设置锚点左下角  
  52.     mGround0->setAnchorPoint(ccp(0, 0));  
  53.     CCSize groundSize = mGround0->getContentSize();  
  54.     mGround0->setPosition(ccp(0, GROUND_HEIGHT - groundSize.height));  
  55.     mLayer->addChild(mGround0);  
  56.       
  57.     // 一张地图宽度  
  58.     mMapWidth = mMap0->getContentSize().width;  
  59.       
  60.     // 背景1,设置锚地左下角,位置  
  61.     mMap1->setAnchorPoint(ccp(0, 0));  
  62.     mMap1->setPosition(ccp(mMapWidth, 0));  
  63.     mLayer->addChild(mMap1);  
  64.       
  65.     // 地板1,设置锚点左下角,位置  
  66.     mGround1->setAnchorPoint(ccp(0, 0));  
  67.     mGround1->setPosition(ccp(mMapWidth, GROUND_HEIGHT - groundSize.height));  
  68.     mLayer->addChild(mGround1);  
  69.       
  70.     return true;  
  71. }  
  72.   
  73. /**地图循环逻辑*/  
  74. bool MapManager::chechReloadMap(float eyeX)  
  75. {  
  76.     int newCur = eyeX / mMapWidth;  
  77.     if (mCurMap == newCur) {  
  78.         return false;  
  79.     }  
  80.     // 重载的精灵指针  
  81.     CCSprite* tempMap;  
  82.     CCSprite* tempGround;  
  83.       
  84.     // 重载指针指向滚出的背景和地板精灵  
  85.     if (0 == newCur % mMapCount) {  
  86.         tempMap = mMap1;  
  87.         tempGround = mGround1;  
  88.     }else{  
  89.         tempMap = mMap0;  
  90.         tempGround = mGround0;  
  91.     }  
  92.     mCurMap = newCur;  
  93.     // 重新设置x坐标  
  94.     tempMap->setPositionX(mMapWidth * (mCurMap + 1));  
  95.     tempGround->setPositionX(mMapWidth * (mCurMap + 1));  
  96.     return true;  
  97. }  

然后在PlayScene.cpp里面的init函数里面加入这个node,不然会被干掉导致错误

  1. mMapManager = MapManager::create(this, mWorld);  
  2. this->addChild(mMapManager);  

然后在update里面加入地图重载逻辑

  1. if (mMapManager->chechReloadMap(mLastEyeX)) {  
  2.     CCLog("reload map");  
  3. }  

好了,这里就完成了,下一篇要完成这个项目了,期待一下哦 大笑
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值