cocos2dx游戏引擎之simpleGame学习总结(一)

        最近在一位大哥的带领下学习cocos2dx,进展甚慢,还好有问题可以像他请教,在此谢过!
        今天偷懒学习了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;

}

}

                                                                                                                                                                                   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值