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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章