前几天写自己的开源项目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则是我们每个工程特有的类,我们可以修改这里的每一个函数,符合我们的游戏需要,只要注意下初始化的的顺序就行。