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

  • 相关阅读:
    系统右键菜单添加剪贴板清空项(隐藏DOS窗口)
    C++实现黄金分割数列(斐波纳奇数列)(非递归)
    vbs让电脑发音说话
    修改远程桌面端口号.bat
    C#实现鸽巢排序
    C++用递归方式实现在对不更改随机数组的情况下查找最大值
    C# 实现 微软WebRequestMethods.Ftp类中的FTP操作功能
    C# “快捷方式” 实现程序开机启动
    C++ DateTime 结构
    C# UDP 连接通信 简单示例
  • 原文地址:https://www.cnblogs.com/live-in-city/p/3409479.html
Copyright © 2011-2022 走看看