cocos2dx 执行流程分析

前端之家收集整理的这篇文章主要介绍了cocos2dx 执行流程分析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

看了教程,还是要自己写写HelloWorld才能记住,于是在写HelloWorld之前,还是要看看别人的HelloWorld才行~

(以下CS-X均为Cocos2D-X的缩写)

1. 导演类

VS新建一个CS-X工程,然后自己帮我们生成一个HelloWorld工程,然后看看AppGelegate.app文件,里面有这个函数

bool AppDelegate::applicationDidFinishLaunching()

{

// initialize director

CCDirector *pDirector = CCDirector::sharedDirector();

pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());

// enable High Resource Mode(2x,such as iphone4)and maintains low resource on other devices.

//pDirector->enableRetinaDisplay(true);

// turn on display FPS

pDirector->setDisplayStats(true);

// set FPS. the default value is 1.0/60 if you don'tcall this

pDirector->setAnimationInterval(1.0 / 60);

// create a scene. it's an autoreleaSEObject

CCScene *pScene = HelloWorld::scene();

// run

pDirector->runWithScene(pScene);

return true;

}

因为我还是新手,只能从表面上来理解。

CCDirector类,是导演类,在CS-X的里,构建一个游戏,就是构建一个世界(其实我觉得所有的程序都是在构建世界~噗),这个世界由导演类去指导演绎,于是,在打开游戏的第一步时,导演告诉程序:

pDirector->setDisplayStats(true);// 显示FPS数值,方便我查看游戏效率

pDirector->setAnimationInterval(1.0 /60);// 游戏每秒播放多少帧(这里是60帧)

pDirector->runWithScene(pScene);// 进入游戏,首先要显示哪个场景

于是代码都很简单,主要是要留意,一个类继承了CCScene就可以作为场景使用,然后用导演类的runWithScene方法运行游戏的第一个场景,但是以后切换场景就要用replaceScene方法了。

2. 自定义场景

于是现在来看看自定义的场景类,先看看HelloWorldScene.h文件,很短,看着舒服~

class HelloWorld : public cocos2d::CCLayer

{

public:

virtual boolinit();

static cocos2d::CCScene* scene();

void menuCloseCallback(CCObject* pSender);

CREATE_FUNC(HelloWorld);

};

menuCloseCallback函数我觉得可以暂时不理它,算了,还是忍不住要理一下。它是一个回调函数,没了,仅此而已,就是AndroidOnClickListener里面的onClick函数一样,但是又有点不一样,糟糕,我不解释了,乱了,这不是重点~

scene函数是不可缺的,它是CCLayer的类,HelloWorld里要重写这个函数的。那scene函数在哪个地方会用到?还记得之前那段代码吗?新建一个场景类的时候是这样的:

// create a scene. it'san autorelease object

CCScene *pScene = HelloWorld::scene();

// run

pDirector->runWithScene(pScene);

好了,就是这样的。

来看看CREATE_FUNC(HelloWorld);这个我纠结了很久,CREATE_FUNC是一个宏(应该是的,我对C++只停留在初级语法):

#defineCREATE_FUNC(__TYPE__) \

static__TYPE__* create() \

{ \

__TYPE__ *pRet = new__TYPE__(); \

if (pRet&& pRet->init())\

{ \

pRet->autorelease(); \

return pRet; \

} \

else \

{ \

delete pRet; \

pRet = NULL; \

return NULL; \

} \

}

CREATE_FUNC实际上就是create函数,准确的说,是重写了CCLayer里的create函数,看看CCLayercreate函数

CCLayer*CCLayer::create()

{

CCLayer *pRet = newCCLayer();

if (pRet&& pRet->init())

{

pRet->autorelease();

return pRet;

}

else

{

CC_SAFE_DELETE(pRet);

return NULL;

}

}

是的,CREATE_FUNC的作用只不过是把create的返回值改成继承了CCLayer的实际子类(有点晕,仔细逻辑一下~

好了,我假设我们已经懂了CREATE_FUNC的作用了,不~!还没呢~!看看

HelloWorldScene.cpp里是怎么重写scene函数的:

CCScene*HelloWorld::scene()

{

CCScene * scene = NULL;

do

{

// 'scene' is an autoreleaSEObject

scene = CCScene::create();

CC_BREAK_IF(! scene);

// 'layer' is an autoreleaSEObject

HelloWorld *layer = HelloWorld::create();

CC_BREAK_IF(! layer);

// add layer as a child toscene

scene->addChild(layer);

}while (0);

// return the scene

return scene;

}

于是我们发现了,虽然HelloWorld自称是场景类,但是导演要的并不是它~!导演还是要了一个真正的CCScene类,不信你看:

scene = CCScene::create();

这里创建了一个真正的CCScene类。

还不够,再看:

HelloWorld *layer = HelloWorld::create();

scene->addChild(layer);

HelloWorld只是作为一个layer(一个层),它被添加到刚刚创建的那个CCScene类了。好吧,现实很残酷,尽管HelloWorld基础了场景类,可它依旧不是一个真正的场景~!

,紧接着,不要放松,还记得刚刚create函数里有这几句吗?

if (pRet && pRet->init())

{

pRet->autorelease();

return pRet;

}

OK,我知道大家还记得的,于是刚刚拿两句又还记得吗?

HelloWorld *layer = HelloWorld::create();

scene->addChild(layer);

是的,也就是说,场景类的init函数是一定会被调用的。

于是,这就表示,继承了CCScene的类,必须要有这三个家伙:

public:

virtual boolinit();

static cocos2d::CCScene* scene();

CREATE_FUNC(HelloWorld);

};

3.最后的最后,当然是总结

很混乱,我自己也很混乱,原来我的表达能力(噗,我自己也无法原谅自己啊= =),所以要总结一下。

1).HelloWorld工程主要就是教我们创建一个场景类

2).AppDelegate.cpp里会创建第一个显示的场景类,此时用的方法runWithScene

3).要新建一个场景类,就一定要有以下三个函数

virtualbool init();// 初始化,可以在这里创建精灵

staticcocos2d::CCScene* scene(); // 在这里要自己新建一个CCScene类,然后把我们自定义的场景类作为一个CCLayer添加到这个CCScene类中

CREATE_FUNC(HelloWorld);// 相当于重写create函数,让create函数返回子类对象。

4.然后,就是这样了。

好了,以上就是我从HelloWorld工程能够发现的东西了,肯定会有不少错误的思想,但是现在的我还无法修正。所以,仅供参考,嘿嘿~

猜你在找的Cocos2d-x相关文章