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

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轴位置

//
//  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__) */

看下实现:

//
//  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,不然会被干掉导致错误

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

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

    if (mMapManager->chechReloadMap(mLastEyeX)) {
        CCLog("reload map");
    }
cocos2d-x游戏开发 跑酷(六) map循环
好了,这里就完成了,下一篇要完成这个项目了,期待一下哦cocos2d-x游戏开发 跑酷(六) map循环