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

来源:互联网 发布:福州软件测试招聘 编辑:程序博客网 时间:2024/06/05 18:41
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:本人菜鸟,如有错误。请各位多多包涵并指出。不胜感激!




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一个人的微信被删了找不到了怎么办 不想回对方微信怎么办 喜欢我的人太多怎么办 假如战争今夜打响我们该怎么办 约客户客户说忙怎么办 第一天来姨妈痛怎么办 痛经痛的很厉害怎么办 工作第一天被辞怎么办 第一天练车紧张怎么办 到新公司第一天怎么办 我妈上班别人欺负怎么办 欺负别人他妈来找了怎么办 家人都欺负我妈怎么办 人老了日不动了怎么办? 日照职业技术学院公租房怎么办留宿 眼镜上沾了胶水怎么办 近视镜片刮花了怎么办 墨镜镜片磨花了怎么办 邻居养狗味道大怎么办 邻居不让养狗了怎么办 养狗地板有味道怎么办 狗狗嘴巴被大狗咬肿了怎么办 花了钱心里难受怎么办 狗在屋里有味道怎么办 养狗家里有异味怎么办 养狗房子有味道怎么办 狗身上有腥臭味怎么办 狗狗不想养了怎么办 药流2天后没出血怎么办 药流当天血多怎么办 怀孕四十天不想要怎么办 人流后出血量大怎么办 药流一直不出血怎么办 药流一直不见红怎么办 药流12天还流血怎么办? 把别人车刮了怎么办 车划掉漆了怎么办啊 倒车时碰了车怎么办 车头掉了一点漆怎么办 新买的车被刮了怎么办 白色车车头漆掉了一小块怎么办