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?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
//
// 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?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
//
// 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?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
mMapManager = MapManager::create(this, mWorld);
this->addChild(mMapManager);
然后在update里面加入地图重载逻辑
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
if (mMapManager->chechReloadMap(mLastEyeX)) {
CCLog("reload map");
}
![](http://img.blog.csdn.net/20140325184232062)
好了,这里就完成了,下一篇要完成这个项目了,期待一下哦
现在人物可以跑动,可以跳跃和下蹲。但是他还是一个孤独的runner,在一片漆黑的世界里跑在一条永无止境的线上。现在给他加上背景和地板,让他跑在一个色彩斑斓的世界。
泰然JS版的跑酷,这个地图是一个自定义class。在C++里面尽量不要自定义一个class,不然你new一个对象,再delete它,虽然也是一样能跑,但是跟引擎风格不一致,看起来感觉怪怪的。
我这里创建一个MapManager继承CCNode,同样给它一个create静态函数和一个init函数,跟引擎结构一样:
主要逻辑是这样的:
1.将背景和地板的锚点设置为左下角,两张连接起来摆放
2.摄像机移动,如果第一张超出摄像机范围,则重载指针指向这个精灵
3.通过重载指针重新设置x轴位置
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
//
// 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?
![](https://code.csdn.net/assets/CODE_ico.png)
//
// 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?
![](https://code.csdn.net/assets/CODE_ico.png)
mMapManager = MapManager::create(this, mWorld);
this->addChild(mMapManager);
然后在update里面加入地图重载逻辑
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
if (mMapManager->chechReloadMap(mLastEyeX)) {
CCLog("reload map");
}
好了,这里就完成了,下一篇要完成这个项目了,期待一下哦
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
相关文章推荐
- cocos2d-x游戏开发 跑酷(六) 地图循环
- Cocos2d-X游戏【泰然网《跑酷》】JS到C++移植9:Map Loop【地图循环加载】
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&主角加入动作
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&主角添加动作
- cocos2d-x游戏开发(三)游戏主循环
- 【Cocos2d-X开发学习笔记】第27期:游戏背景之贴图地图类(CCTileMapAtlas)的使用
- 【cocos2d-x IOS游戏开发-城市跑酷13】游戏玩法:友情提示:how to play?
- 【cocos2d-x IOS游戏开发-城市跑酷17】Game Over,主角死亡?+死亡特效:帽子飞起来!
- lua脚本调用cocos2d-x 之实现精灵、Tmx地图创建【iOS游戏开发征文】
- 【cocos2d-x IOS游戏开发-城市跑酷7】设计烟囱与烟的效果
- 【cocos2d-x IOS游戏开发-城市跑酷14】重写触屏[Touch]事件处理机制,响应玩家操作
- 【cocos2d-x IOS游戏开发-城市跑酷9】没有各种坑还叫游戏吗
- 【cocos2d-x IOS游戏开发-城市跑酷16】碰撞检测:撞墙 or 从房子上掉下来
- 【Cocos2d-X开发学习笔记】第26期:游戏背景之滚动地图背景(CCParallaxNode)的使用
- 【cocos2d-x IOS游戏开发-城市跑酷15】完善积分板【CCLabelBMFont】
- cocos2d-x游戏开发(三)无限滚动地图
- 【Cocos2d-X开发学习笔记】第26期:游戏背景之滚动地图背景(CCParallaxNode)的使用
- 【cocos2d-x IOS游戏开发-城市跑酷2】python create_project
- 【cocos2d-x IOS游戏开发-城市跑酷3】读取资源,设置背景层
- 【cocos2d-x IOS游戏开发-城市跑酷18】统计结果,主角复活Try Again!!