今天偷懒学习了cocos2dx之simpleGame,总结如下,以备将来之需!
GameOverScene.cpp文件分析:
//游戏场景初始化
/*****************************************************************************
*** 方法功能说明://GameOverScene::init():创建一个GameOverLayer类对象, ***
***使对象引用数+1,然后将这个对象作为子对象添加到CCScene对象中******************************************************************************/
bool GameOverScene::init()
{
//场景类自身初始化
If (CCScene::init())
{
//_layer:只读标签,在CC_SYNTHESIZE_READONLY(GmaeOverLayer*, _layer, Layer)中
//定义,下面这个方法用来创建一个GameOverLayer类对象
//引用create()实际会调用宏定义CREATE_FUNC(GameOverLayer),该宏定义稍后讲到
this -> _layer = GameOverLayer::create();
//retain():CCObject类的成员方法,使对象引用数加1,这个地方不太明白
this -> _layer -> retain();
this -> addChild(_layer);
teturn true;
}
else {
return fales;
}
}
//CREATE_FUNC()宏定义如下:
#define CREATE_FUNC(__TYPE__) \
static __TYPE__ *create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
If (pRet && pRet -> init()) \
{ \
pRet -> autorelease(); \
return pRet; \
} \
Else \
{ \
Delet pRet; \
pRet = NULL; \
return NULL; \
} \
}
/******************************************************************************
功能说明:GameOverScene::~GameOverScene():清理_layer对象
*****************************************************************************/
GameOverScene::~GameOverScene()
{
If (_layer)
{
_layer -> release();
_layer = NULL;
}
}
//游戏层初始化
bool GameOverLayer :: init()
{
//设置(背景层?)层的颜色,采用RGBA 32bit描述,稍后详细讲解
If (CCLayerColor :: initWithColor ( ccc4(255, 255, 255, 255) ))
{
CCSize winSize = CCDirector :: sharedDirector() -> getWinSize();
//引用GameOverLayer 类中CC_SYNTHESIZE_READONLY方法,见上述说明。
//设置字体及字体大小
this -> _label = CCLabelTTF :: create(“”, “Artial”, 32);
_label -> retain();
//设置_label 颜色
_label -> setColor( cc3(0, 0, 0) );
//设置标签位置
_label -> setPosition( ccp(winSize.width/2, winSize.height/2) );
this -> addChild(_label);
//启动层动作
//CCSequence :: create(CCFiniteTimeAction *pAction1….):辅助构造函数创建一组
//连续的动作
this -> runAction( CCSequence :: create( CCDelayTime :: create(3),
CCCallFunc::create(this,
Callfunc_selector(GameOverLayer :: gameOverDone)),
NULL) );
return true;
}
else {
return false;
}
}
//相关方法说明
CCDelayTime::create(3)方法体如下:
//CCDelayTime : 动作延时一定量的时间
CCDelayTime * CCDelayTime :: create(float d)
{
CCDelayTime *pAction = new CCDelayTime();
pAction -> initWithDuration(d);
pAction -> autorelease();
return pAction;
}
//有如下宏定义:#define callfunc_selector(SELECTOR) (SEL_CallFunc) (&_SELECTOR)
现在来对源码中的该方法做简单说明:
首先typedef void (CCObject::*SEL_CallFunc) ()来定义SEL_CallFunc为一个函数指针
接着通过#define callfunc_selector(SELECTOR) (SEL_CallFunc) (&_SELECTOR),从而实现Callfunc_selector(GameOverLayer :: gameOverDone) == SEL_CallFunc(GameOverLayer :: gameOverDone);
我们在来看看源代码吧:
//CCCallFunc::create(this, Callfunc_selector(GameOverLayer :: gameOverDone))
CCCallFunc *CCCallFunc::create(CCObject *pSelectorTarget, SEL_CallFunc selector)
{
CCCallFunc *pRet = new CCCallFunc();
if (pRet && pRet -> initWithTarget(pSelectorTarget)) {
pRet -> m_pCallFunc = selector;
pRet -> autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}
有上面的分析可以知道:该方法会返回一个绑定有Callfunc_selector方法的CCCallFunc类对象指针。这样,当CCCallFunc对象创建后,就会回调callfunc_selector中绑定的方法,执行相应的功能。
现在来看看callfunc_selector中绑定的方法:
/**********************************************************************************方法功能说明:用HelloWorld::scene()场景取代当前运行的场景(GameOverScene),当前场
****将会被终止。用来实现场景切换
******************************************************************************/
void GameOverLayer :: gameOverDone()
{
CCDirector :: sharedDirector() -> replaceScene( HelloWorld :: scene());
}
此时我们将进入到下一个场景,稍后将会介绍。
最后一个方法:~ GameOverLayer (),用来回收资源
GameOverLayer :: ~GameOverLayer()
{
if (_label)
{
_label -> release();
_label = NULL;
}
}