cocos2d-x 场景切换管理

接触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);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值