COCOS2DX 3.0 学习笔记:从源码分析Cocos2dx 3.0 Director类

Cocos2d x 3.0一个很明显的变化是类名去CC 。比如CCDirector 变成了Director  CCSprite 变成了Sprite
以及单例对象的指针获取 统一改为了 类::::getInstance().

比如Director::getInstance() 

当然2.X之前的Director* sharedDirector()方法还是能用的 但是已经声明为废弃:也许在3.0正式版内可能会被去掉。

之前没有学习过2.X版本 但是看的书都是介绍2.X版本的。新学3.0所以从Cocos2dx的Object开始。
Object类是所有coco里面元素的祖先类。类似于C#的Object 和Delphi的TObject。在Coco里面经常用的到的对象 比如 精灵 节点 导演 层 的根源都是object

Object里面主要实现的是引用计数以及为了实现脚本引擎内标示的ID

public:
    /// object id, ScriptSupport need public _ID 每个Object都有一个公开的_ID字段来作为其身份的标志
    unsigned int _ID;
    /// Lua reference id
    int _luaID;
protected:
    /// count of references 引用的次数。 
    unsigned int _referenceCount; 
Coco内部管理的内存方法是使用引用计数。通过引用次数来判断对象是否需要销毁。所以Object主要是为了coco管理内存而做的一个基类。

Object是在base/CCobject.h中定义的。可以看出虽然类名去了CC 但是类文件还是没有去掉CC 可能以后会去掉吧。

在这里面还有几个函数指针的原型定义供大家参考:

typedef void (Object::*SEL_SCHEDULE)(float);
typedef void (Object::*SEL_CallFunc)();
typedef void (Object::*SEL_CallFuncN)(Node*);
typedef void (Object::*SEL_CallFuncND)(Node*, void*);
typedef void (Object::*SEL_CallFuncO)(Object*);
typedef void (Object::*SEL_MenuHandler)(Object*);
typedef int (Object::*SEL_Compare)(Object*);

再看Director类:

为了打字方便就用中文称呼吧导演类。

这个类是直接从Object类派生的。使用的是单例模式。

在导演类内部发现了以下声明代码

    enum class Projection
    {
        /// sets a 2D projection (orthogonal projection)
        _2D,
        
        /// sets a 3D projection with a fovy=60, znear=0.5f and zfar=1500.
        _3D,
        
        /// it calls "updateProjection" on the projection delegate.
        CUSTOM,
        
        /// Default projection is 3D projection
        DEFAULT = _3D,
    };
    
从代码意图上来看也许coco会走3D的路线。

默认情况下导演的导演项目是3D

所以在3.0下如果升级2.X的项目最好是使用

Director::getInstance()->setProjection(_2D);

来确定其项目属性。

导演类内部还有一个TextureCache*(纹理缓存)指针

TextureCache类是一个保存纹理的一个容器。这个类也是一个单例对象,也就是说导演类对其只有使用权,并无所有权。

纹理缓冲是一个管理纹理的容器,可以通过

Director::getInstance()->getTextureCache()->addImage(文件名,关键字),来添加图片生成纹理(Texture2D)。

Director::getInstance()->getTextureCache()->getTextureForKey(关键字)来返回Texture2D

并且可以定时使用

Director::getInstance()->getTextureCache()->removeUnusedTextures(); 来释放未使用的Texture2D。

如果当需要更换场景也可以使用

Director::getInstance()->getTextureCache()->removeAllTextures();释放掉所管理的所有纹理。减少内存占用。

而且Sprite加载文件生成对象之前 就是预先使用Director::getInstance()->getTextureCache()->addImage 之后生成对象的。

导演类主要负责的工作是对场景的管理。

比如运行 暂停 恢复 场景以及更换场景 的工作。

以下列出导演类的一些常用到的方法(其实cocos2dx对所有代码都进行了注释需要用到某个类的时候只需要查看其注释就好了):

const Size& getWinSize() const; //获取窗口大小
Point convertToGL(const Point& point);//转换UI座标到GL座标系
Point convertToUI(const Point& point);//转换到UI座标到GL座标系   这两个座标系的原点以及朝向不同。
void runWithScene(Scene *scene);//运行一个场景
void pause();//暂停运行的场景
void resume();//恢复暂停运行的场景
inline Scene* getRunningScene() { return _runningScene; }//返回正在运行的场景指针


PS:本人菜鸟,如有错误。请各位多多包涵并指出。不胜感激!




发布了21 篇原创文章 · 获赞 3 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章