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:本人菜鸟,如有错误。请各位多多包涵并指出。不胜感激!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值