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

cocos2d-x 场景切换管理

2014-05-15 14:56 375 查看
接触cocos2d-x已有挺长时间(13年暑假开始),虽然其中有段时间没有弄它,但是基础还是有的。最近在做一个课程的大作业时候,遇到了一个因为自己的强迫症而导致的问题,现在跟大家分享。

这个大作业是一个游戏,既然是游戏,肯定涉及到场景切换,而这片博客呢,谈的就是我自己的场景切换。

先看代码 

class SelectLevel : public CCLayer
static CCScene* scene();
CCScene* SelectLevel::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();
// 'layer' is an autorelease object
SelectLevel *layer = SelectLevel::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}

在这个工程里,每个cocos类都继承成了CCLayer,都含有这样一个静态的方法scene(),把自己定义的layer添加到一个scene里,即一个场景一个图层。
在选关界面中,会有不同的关卡可供选择,我的处理是让把每个关卡都定义成精灵,并且为了避免在场景里编写是否点击了该区域以及点击该区域之后的回调函数。因为我觉得这样的代码太多而且很多都是在类似的重复,每个精灵不过就是所对应的回调函数里,下一个场景不同,其他都是一样的。再加上我的强迫症,肯定不允许自己写那么多“重复”的代码。因此,我就把判断是否点击了该关卡以及点击之后的实现,移到了一个自定义的cocos精灵类(即继承了CCSprite)。

于是就出现了下面的代码,基本上这段代码就实现了自定义精灵类(我的名字叫MyButton)

class MyButton :public CCSprite, public CCTouchDelegate
{
public:
static MyButton* createWithTexture(CCTexture2D *pTexture);

CCRect getRect();
bool containsTouchLocation(CCTouch *touch);

virtual void onEnter();
virtual void onExit();

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
};

但是写完这些后发现,每个MyButton并不知道下一个场景是什么,因此需要在实例化的时候告诉那个实例你对应的下一个场景是什么。在cocos2d-x里,场景切换多数采用如下代码
CCDirector::sharedDirector()->replaceScene(SelectLevel::scene());

因此,只需要在原来的MyButton类中添加一个存储replaceScene中的参数CCScene即可。于是,完整的MyButtton类如下,

class MyButton :public CCSprite, public CCTouchDelegate
{
private:
CCScene *navigateTo;

public:
static MyButton* createWithTexture(CCTexture2D *pTexture);
void setNavigation(CCScene *navigateTo);
CCRect getRect();
bool containsTouchLocation(CCTouch *touch);

virtual void onEnter();

virtual void onExit();

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);

};
void MyButton::setNavigation(CCScene *navigateTo)
{
this->navigateTo = navigateTo;
navigateTo->retain();
}
void MyButton::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
if (containsTouchLocation(touch))
{
CCDirector::sharedDirector()->replaceScene(navigateTo);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息