cocos2d-x的启动分析

前几天写自己的开源项目robotech(地址:git@code.csdn.net:dengqianyi/robotech.git),碰到一个很莫名其妙的问题,在调用CCTiledMap类时,类的实现中得到的纹理大小总是为NULL.经过一番查找与实验,发现问题点在于自己的代码调用的地方。因为是自己设计的一个框架,不再是简单的类似cocos2d-x一般的游戏方式(ccscene+cclayer),所以一些全局变量在使用时,要考虑到初始化的问题,在这里就栽了一个跟头。

先说说cocos2d-x的mainloop流程:(参考网址http://blog.csdn.net/marcus_x/article/details/9208835)

在main中,一般会有此2句为AppDelegate app;CCApplication::sharedApplication()->run();  AppDelegate为每个工程独立的类,继承于CCApplication,重载了applicationDidFinishLaunching函数。

在run的执行过程中,会首先调用applicationDidFinishLaunching进行初始化,一定意义上讲,这个函数才是cocos2d-x的第一个初始化函数。

我们来看看applicationDidFinishLaunching做了哪些关键性的初始化工作:

1.初始化全局的一个CCDirector

2.为CCDirector指定CCEGLView对象

3.为CCEGLView指定CCScene()

 

经过测试,如果我把CCTiledMap类在pDirector->setOpenGLView(pEGLView);语句之前调用,在执行过程中是得不到纹理相关的操作,导致异常,在其之后执行则没问题。在上述3之前调用也没问题。

我们看看pDirector->setOpenGLView(pEGLView);都做了什么操作:

1.收集GPU信息

2.删除原有的m_pobOpenGLView

3.声明和初始化 CCTextureCache::sharedTextureCache();

4...........其余不再描述

看到这里,也就找到我问题的原因了,Tiledmap的调用提前时,sharedTextureCache并没有被初始化好,所以得到的都是空值。

从初始化的过程来看,也可以看到cocos2d-x各个模块的分工,CCDirector保持了很多引擎运行过程中的全局变量(比如 CCScheduler,CCActionManager,内存管理)等,mainloop函数也封装在这里。

至于AppDelegate则是我们每个工程特有的类,我们可以修改这里的每一个函数,符合我们的游戏需要,只要注意下初始化的的顺序就行。

posted @ 2013-11-05 22:46  城市*斗士(技术)  阅读(305)  评论(0编辑  收藏  举报