天天看點

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遊戲開發 跑酷(六) 地圖循環

好了,這裡就完成了,下一篇要完成這個項目了,期待一下哦

cocos2d-x遊戲開發 跑酷(六) 地圖循環

繼續閱讀