轉載請注明出處: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");
}
好了,這裡就完成了,下一篇要完成這個項目了,期待一下哦