zoukankan      html  css  js  c++  java
  • 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则是我们每个工程特有的类,我们可以修改这里的每一个函数,符合我们的游戏需要,只要注意下初始化的的顺序就行。

  • 相关阅读:
    2020年软件测试需要学什么技术?软件测试人员需要懂代码?软件测试工程师要经常加班吗?
    那些价值数亿的史上最强的【Bug之母】你都知道吗?
    接口自动化测试之-requests模块详解
    linux更新源管理
    Vscode的使用小技巧
    半吊子菜鸟学Web开发 -- PHP学习5-数据库
    半吊子菜鸟学Web开发 -- PHP学习 1-基础语法
    半吊子菜鸟学Web开发 -- PHP学习 4 --异常
    半吊子菜鸟学Web开发 -- PHP学习3-文件
    半吊子菜鸟学Web开发 -- PHP学习2-正则,cookie和session
  • 原文地址:https://www.cnblogs.com/live-in-city/p/3409479.html
Copyright © 2011-2022 走看看