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

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

2014-05-22 15:01 330 查看
转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/22066007

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

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

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

主要逻辑是这样的:

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

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

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

[cpp] view
plaincopyprint?





//  

//  Map.h  

//  Parkour  

//  

//  Created by lerry on 3/25/14.  

//  

//  

  

#ifndef __Parkour__Map__  

#define __Parkour__Map__  

  

#include "cocos2d.h"  

#include "resources.h"  

#include "Box2D/Box2d.h"  

USING_NS_CC;  

  

class MapManager : public CCNode  

{  

    CCLayer* mLayer;  

      

    b2World* mWorld;  

      

    float mMapWidth;  

      

    int mMapCount;  

      

    CCSprite* mMap0;  

      

    CCSprite* mMap1;  

      

    CCSprite* mGround0;  

      

    CCSprite* mGround1;  

      

    int mCurMap;  

      

public:  

      

    MapManager();  

      

      

    static MapManager* create(CCLayer* layer, b2World* world);  

      

    bool init(CCLayer* layer, b2World* world);  

      

    bool chechReloadMap(float eyeX);  

};  

  

#endif /* defined(__Parkour__Map__) */  

看下实现:

[cpp] view
plaincopyprint?





//  

//  Map.cpp  

//  Parkour  

//  

//  Created by lerry on 3/25/14.  

//  

//  

  

#include "Map.h"  

  

MapManager::MapManager():mLayer(NULL),mWorld(NULL),mMapWidth(0),mMapCount(2),mMap0(NULL),mMap1(NULL),mGround0(NULL),mGround1(NULL),mCurMap(0)  

{  

      

}  

  

  

MapManager* MapManager::create(cocos2d::CCLayer *layer, b2World *world)  

{  

    MapManager* map = new MapManager();  

    if (map && map->init(layer, world)) {  

        map->autorelease();  

        return map;  

    }else  

    {  

        delete map;  

        map = NULL;  

        return NULL;  

    }  

}  

  

/**传一个主CCLayer,主Layer里面的物理世界*/  

bool MapManager::init(cocos2d::CCLayer *layer, b2World *world)  

{  

    if (!CCNode::init()) {  

        return false;  

    }  

    mLayer = layer;  

    mWorld = world;  

      

    // 两张背景,两张地板  

    mMap0 = CCSprite::create(map0);  

    mMap1 = CCSprite::create(map1);  

    mGround0 = CCSprite::create(ground0);  

    mGround1 = CCSprite::create(ground1);  

      

    // 背景0,设置锚点左下角  

    mMap0->setAnchorPoint(ccp(0, 0));  

    mMap0->setPosition(ccp(0, 0));  

    mLayer->addChild(mMap0);  

      

    // 地板0,设置锚点左下角  

    mGround0->setAnchorPoint(ccp(0, 0));  

    CCSize groundSize = mGround0->getContentSize();  

    mGround0->setPosition(ccp(0, GROUND_HEIGHT - groundSize.height));  

    mLayer->addChild(mGround0);  

      

    // 一张地图宽度  

    mMapWidth = mMap0->getContentSize().width;  

      

    // 背景1,设置锚地左下角,位置  

    mMap1->setAnchorPoint(ccp(0, 0));  

    mMap1->setPosition(ccp(mMapWidth, 0));  

    mLayer->addChild(mMap1);  

      

    // 地板1,设置锚点左下角,位置  

    mGround1->setAnchorPoint(ccp(0, 0));  

    mGround1->setPosition(ccp(mMapWidth, GROUND_HEIGHT - groundSize.height));  

    mLayer->addChild(mGround1);  

      

    return true;  

}  

  

/**地图循环逻辑*/  

bool MapManager::chechReloadMap(float eyeX)  

{  

    int newCur = eyeX / mMapWidth;  

    if (mCurMap == newCur) {  

        return false;  

    }  

    // 重载的精灵指针  

    CCSprite* tempMap;  

    CCSprite* tempGround;  

      

    // 重载指针指向滚出的背景和地板精灵  

    if (0 == newCur % mMapCount) {  

        tempMap = mMap1;  

        tempGround = mGround1;  

    }else{  

        tempMap = mMap0;  

        tempGround = mGround0;  

    }  

    mCurMap = newCur;  

    // 重新设置x坐标  

    tempMap->setPositionX(mMapWidth * (mCurMap + 1));  

    tempGround->setPositionX(mMapWidth * (mCurMap + 1));  

    return true;  

}  

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

[cpp] view
plaincopyprint?





mMapManager = MapManager::create(this, mWorld);  

this->addChild(mMapManager);  

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

[cpp] view
plaincopyprint?





if (mMapManager->chechReloadMap(mLastEyeX)) {  

    CCLog("reload map");  

}  



好了,这里就完成了,下一篇要完成这个项目了,期待一下哦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐