核心類】
導演Director、場景Scene、佈景層Layer、精靈Sprite的概念請移步: cocos2dx基礎篇(3)——第一個程序HelloWorld
導演控制場景,場景控制圖層,圖層控制精靈,精靈控制動作。
相互之間的關係框架如下圖所示:
由此看出:
(1)整個遊戲一般只有一個導演。
(2)一個遊戲可以由多個場景組成(菜單界面、遊戲界面、遊戲結束界面等),但是每次導演只能指導一個場景的運作。
(3)一個場景可以由多個圖層組成(背景層、道具層、英雄層、怪物層等,每個圖層都可以由多個精靈元素組成(標籤、按鈕、菜單等)。
(4)對於圖層上的每個精靈元素,一般都附帶相應的動作,可以帶多個動作。如揮刀、使用魔法、跑、跳,以及放大、縮小、旋轉等動作。
【導演Director】
就和現實中的導演一樣,這裏的導演也是起到指導的作用的。導演在這裏負責的就是讓不同的場景切換,控制整個遊戲的流程,包括開始,繼續,暫停等。以及設置、獲取系統信息,比如調整OpenGL相關的設置,獲取屏幕的大小等。
和Scene、Layer、Sprite等不同的是,導演類Director是直接繼承Ref類的,而不是Node類。
繼承關係如下:
主要函數如下:
//
/**
導演類Director主要是用來:
- 創建一個主窗口
- 管理場景Scene
Director 也負責以下:
- 初始化 OpenGL 內容
- 設置 OpenGL 像素格式 (默認值時 RGB565)
- 設置 OpenGL 緩存大小 (默認是 0-bit)
- 設置 投影 (默認是一個 3D)
- 設置 方向 (默認是豎屏Portrait)
Director 是一個單例對象, 標準的調用方法是:
- Director::getInstance()->methodName();
*/
class CC_DLL Director : public Ref
{
/**
* 獲取單例對象
*/
//獲取全局唯一的Director實例 , 替代 sharedDirector
//使用方法:Director::getInstance()->replaceScene(scene);
static Director* getInstance();
/**
* 場景管理相關
* - runWithScene
* - pushScene
* - popScene , popToRootScene , popToSceneStackLevel
* - replaceScene
* - pause , resume , end
* - getRunningScene , isPaused
*/
//指定進入Director的主循環運行的場景.
//ps:僅在運行第一個場景時調用,如果已經存在運行中的場景,不能調用本方法.
//本方法調用後將調用pushScene方法,然後調用startAnimation.
void runWithScene(Scene *scene);
//將運行中的場景暫停,並push到場景堆棧中,運行新的場景.
void pushScene(Scene *scene);
//從場景堆棧中pop出一個場景,替換現在正運行的場景,而運行中的場景將被刪除.
void popScene();
//從場景堆棧中pop出所有場景,最後一個棧底的場景將替換現在正運行的場景,而運行中的場景將被刪除.
void popToRootScene();
//彈出從隊列中的所有場景,直到它到達 level.
//如果 level 是 0,它將結束 director.
//如果 level 是 1, 從隊列中彈出所有的場景,直到只有根場景在隊列中.
//如果 level <= 當前的堆棧水平,它不會做任何事情。
void popToSceneStackLevel(int level);
//使用新場景替換當前場景,而運行中的場景將被刪除.
//PS:舊場景不壓入堆棧,而是直接刪除.
void replaceScene(Scene *scene);
void pause(void); //暫停場景
void resume(void); //恢復被暫停的場景
void end(void); //終止執行,釋放運行中的場景. GL view需手動移除.
inline Scene* getRunningScene(); //獲取當前運行的場景
inline bool isPaused(); //Director 是否被暫停
/**
* 刷新幀數FPS相關
* - setAnimationInterval
* - setDisplayStats
* - getSecondsPerFrame , getTotalFrames
*/
//設置程序的FPS值. 即刷新頻率,相連兩幀的時間間隔.
//如dValue = 1.0/60.0 表示每秒60幀.
virtual void setAnimationInterval(double interval) = 0;
inline double getAnimationInterval();
//是否在左下角顯示 FPS
inline void setDisplayStats(bool displayStats);
inline bool isDisplayStats();
//獲取每秒執行幀數
inline float getSecondsPerFrame()
//從 Director 開機後,總共已經渲染了多少幀
inline unsigned int getTotalFrames();
/**
* OpenGL圖形渲染相關
* - setOpenGLView
* - setProjection
* - getTextureCache
* - setViewport , setGLDefaultValues , setAlphaBlending , setDepthTest
*/
//獲取渲染所有東西的GLView
void setOpenGLView(GLView *openGLView);
inline GLView* getOpenGLView();
//設置一個 OpenGL 投影
// Projection::_2D : 設定的二維投影(正投影)
// Projection::_3D : 使用 fovy=60, znear=0.5f and zfar=1500 設置一個3D投影
// Projection::CUSTOM : 投影委託裏面它調用 "updateProjection".
// Projection::DEFAULT = _3D : 默認投影是 3D 投影
void setProjection(Projection projection);
inline Projection getProjection();
TextureCache* getTextureCache() const; //獲取紋理緩衝
void setViewport(); //設置glViewport
void setGLDefaultValues(); //設置 OpenGL 默認值
void setAlphaBlending(bool on); //啓用/禁用 OpenGL alpha 混合
void setDepthTest(bool on); //啓用/禁用 OpenGL 深度測試
/**
* OpenGL View視圖相關
* - getWinSize
* - getVisibleSize , getVisibleOrigin
* - convertToGL , convertToUI
*/
//類似手機屏幕的大小
const Size& getWinSize() const; //獲取OpenGL view大小,單位點.
Size getWinSizeInPixels() const; //獲取OpenGL view大小,單位像素.
//類似程序的遊戲區域
//如果不調用GLView::setDesignResolutionSize(), 值等於getWinSize
Size getVisibleSize() const; //獲取OpenGL View可視區域大小,單位點.
Vec2 getVisibleOrigin() const; //獲取可視區域的原點座標.
//將UIKit座標與OpenGL座標的相互轉換
//UIKit座標 :原點在屏幕的左上角. 從左到右,從上到下.
//OpenGL座標:原點在屏幕的左下角. 從左到右,從下到上.
Vec2 convertToGL(const Vec2& point); //轉爲GL座標
Vec2 convertToUI(const Vec2& point); //轉爲UI座標
/**
* 其他操作
* - purgeCachedData
* - getRenderer
* - setDefaultValues
* - setScheduler , setActionManager , setEventDispatcher
*/
void purgeCachedData(); //移除所有 cocos2d 緩存數據.
Renderer* getRenderer() const; //獲取渲染器(Renderer). v3.0
void setDefaultValues(); //設置配置信息的默認值
void setScheduler(Scheduler* scheduler); //設置與director關聯的調度器
void setActionManager(ActionManager* actionManager); //設置與director關聯的ActionManager
void setEventDispatcher(EventDispatcher* dispatcher); //設置與director關聯的EventDispatcher. v3.0
Scheduler* getScheduler() const;
ActionManager* getActionManager() const;
EventDispatcher* getEventDispatcher() const;
}
//
【場景Scene】
Scene是繼承與Node類的。作爲場景類,它卻只有函數create。因爲場景就像是一個容器,將不同的佈景層(Layer)組合在一起,方便管理。
一個遊戲會有很多的場景,比如,主界面,遊戲界面,載入界面等等都是一個場景。而每一個場景都是由多個圖層組合在一起,形成一個完整的遊戲畫面。
其實在 cocos2dx基礎篇(3)——第一個程序HelloWorld 中就出現了Scene的創建,以及將HelloWorld佈景層放入該Scene中。
繼承關係如下:
主要函數如下:
//
class CC_DLL Scene : public Node
{
static Scene *create(); //大小和屏幕一樣
static Scene *createWithSize(const Size& size); //自定義大小
virtual Scene *getScene() const override; //覆蓋
};
//
【佈景層Layer】
Layer繼承於Node。Layer不僅繼承了CCNode的所有操作,還附加觸控、重力加速度計、支持鍵盤輸入的事件代理。
一個佈景層(Layer)可以包含多個元素,如標籤(Label)、菜單(Menu)、精靈(Sprite)等等。
和2.x對比,3.2版本的Layer做了很大的改動:將觸控函數 ccTouch 改爲 onTouch ,還棄用了好多加速度計、鍵盤輸入事件相關操作函數。
並且對於觸控、加速度計、鍵盤輸入的事件回調函數,將通過3.x中新的事件分發機制來完成。
注意:Layer的錨點默認爲(0,0),即左下角。並且忽略錨點的設置,即使你setAnchorPoint了錨點,Layer的錨點也不會改變,依然是(0,0)。
繼承關係如下:
主要函數如下:
//
class CC_DLL Layer : public Node
{
/**
* 創建佈景層
* - create
*/
static Layer *create();
/**
* 觸控相關
* - 單點觸控 onTouch
* - 多點觸控 onTouches
*/
//單點觸控
virtual bool onTouchBegan(Touch *touch, Event *unused_event);
virtual void onTouchMoved(Touch *touch, Event *unused_event);
virtual void onTouchEnded(Touch *touch, Event *unused_event);
virtual void onTouchCancelled(Touch *touch, Event *unused_event);
//多點觸控
virtual void onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event);
virtual void onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event);
virtual void onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event);
virtual void onTouchesCancelled(const std::vector<Touch*>&touches, Event *unused_event);
/**
* 加速度計相關. 即重力感應.
* - Acceleration爲加速度計信息
* - class Acceleration : public Ref { double x , y , z , timestamp; };
*/
//加速度計監聽事件回調函數
virtual void onAcceleration(Acceleration* acc, Event* unused_event);
/**
* 鍵盤輸入相關
* - KeyCode : 爲鍵盤按下了那個鍵.
* - 舉例 : KEY_BACKSPACE, KEY_ALT, KEY_F1, KEY_0, KEY_A,...
* - 詳情參照: "\cocos\base\CCEventKeyboard.h"
*/
//按下鍵盤, 監聽事件回調函數
virtual void onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event);
//釋放鍵盤, 監聽事件回調函數
virtual void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event);
};
//
【精靈Sprite】
精靈說簡單一點,其實就是一個2D的圖片。並賦予圖片各種屬性以及特性。如大小、顏色、放縮、旋轉、動作等。精靈一般都是放在佈景層(Layer)上面的,即一個佈景層(Layer)應當有許多的精靈存在。精靈可以用來當做背景、人物、鳥、白雲等內容。
Sprite不僅繼承了Node,還繼承了紋理協議接口TextureProtocol。
TextureProtocol紋理協議接口主要是負責紋理圖片的管理。
注意:精靈的錨點默認爲(0.5,0.5),即中心點。
繼承關係如下:
主要函數如下:
//
/**
Sprite定義爲二維圖像, 可以通過一個圖像或一個圖像的矩形裁剪部分創建Sprite.
- 爲了優化Sprite渲染,請遵循以下最佳用法:
- 所有Sprite放入同一個SpriteSheet
- 所有Sprite使用相同的渲染混合函數(BlendFunc)
- 使得渲染器(Renderer)自動批量處理("batch")Sprite (將會在一次OpenGL調用內繪製完成)
- 爲了獲得額外5%~10的渲染優化效果,你可以把Sprite作爲子節點加入到SpriteBatchNode中,
- 但這麼做有以下限制:
- Alias/Antialias屬性屬於SpriteBatchNode,不能單獨設置Sprite的Alias屬性。
- 渲染混合函數(BlendFunc)屬於SpriteBatchNode,不能單獨設置Sprite的渲染混合函數(BlendFunc)。
- 不支持ParallaxNode,不過可以使用代理("proxy")Sprite模擬實現。
- Sprite的子節點只能是其它Sprite(或Sprite的子類)
- Sprite的默認錨點(anchorPoint)爲(0.5, 0.5)。
*/
class CC_DLL Sprite : public Node, public TextureProtocol
{
/**
* 創建方法
* - create
* - createWithTexture
* - createWithSpriteFrame
*/
static Sprite* create(); //默認創建空精靈對象
static Sprite* create(const std::string& filename); //圖片文件(*.png)
static Sprite* create(const std::string& filename, const Rect& rect); //截取圖片文件中某一區域圖片
static Sprite* createWithTexture(Texture2D *texture); //紋理圖片
static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false); //截取紋理圖片中某一區域圖片,是否旋轉
static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame); //精靈幀. 精靈幀一般從plist中讀取的
static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName); //精靈幀的名字
/**
* 批處理節點BatchNode
* - updateTransform
* - setBatchNode
* - getBatchNode
*/
virtual void updateTransform(void); //更新四個值:position(x,y), rotation, scale
virtual void setBatchNode(SpriteBatchNode *spriteBatchNode); //設置批節點,不推薦手工調用
virtual SpriteBatchNode* getBatchNode(void); //如果精靈是由批節點渲染,則返回批節點
/**
* 紋理Texture
* - setTexture
* - setTextureRect
*/
//設置精靈的紋理圖片.
virtual void setTexture(const std::string &filename ); //調用setTextureRect設置Sprite尺寸
virtual void setTexture(Texture2D *texture) override; //紋理的矩形尺寸大小不會改變
virtual Texture2D* getTexture() const override;
//設置Sprite紋理(texture)的Rect尺寸(rect)、是否旋轉(rotated)、裁剪尺寸(untrimmedSize)。
//調用此方法會修改紋理(texture)的座標和頂點位置
virtual void setTextureRect(const Rect& rect, bool rotated = false, const Size& untrimmedSize = rect.size);
/**
* 精靈幀SpriteFrames & 動畫Animation
* - setSpriteFrame
* - isFrameDisplayed
* - getSpriteFrame
* - setDisplayFrameWithAnimationName
*/
//設置新的顯示精靈幀. 替代setDisplayFrame
virtual void setSpriteFrame(const std::string &spriteFrameName);
virtual void setSpriteFrame(SpriteFrame* newFrame);
//返回精靈幀是否正在顯示
virtual bool isFrameDisplayed(SpriteFrame *pFrame) const;
//返回當前顯示的精靈幀. 替代 getDisplayFrame
virtual SpriteFrame* getSpriteFrame() const;
//通過動畫幀的第frameIndex那一幀來設置顯示精靈幀
//動畫幀是從CCAnimationCache中讀取的
virtual void setDisplayFrameWithAnimationName(const std::string& animationName, ssize_t frameIndex);
/**
* 精靈屬性相關
* - setDirty
* - getQuad
* - isTextureRectRotated
* - setAtlasIndex
* - getTextureRect
* - setTextureAtlas
* - getOffsetPosition
* - setFlippedX , setFlippedY
*/
//設置Sprite在紋理集Atlas中是否需要更新
virtual void setDirty(bool dirty);
virtual bool isDirty(void) const;
//返回四個值的信息:座標(x,y),頂點,顏色
inline V3F_C4B_T2F_Quad getQuad(void) const;
//判斷紋理是否被旋轉
inline bool isTextureRectRotated(void) const;
//設置紋理集(TextureAtlas)的當前使用索引
//警告: 除非你瞭解調用此方法的影響,否則不要改變此值
inline void setAtlasIndex(ssize_t atlasIndex);
inline ssize_t getAtlasIndex(void) const;
//返回Sprite的Rect區域信息,單位點
inline const Rect& getTextureRect(void);
//如果採用批渲染,設置紋理地圖集
inline void setTextureAtlas(TextureAtlas *pobTextureAtlas);
inline TextureAtlas* getTextureAtlas(void);
//獲取偏移值
inline const Vec2& getOffsetPosition(void) const;
//設置是否翻轉。
void setFlippedX(bool flippedX); //設置Sprite是否水平翻轉。替代 setFlipX
bool isFlippedX(void) const;
void setFlippedY(bool flippedY); //設置Sprite是否垂直翻轉。替代 setFlipY
bool isFlippedY(void) const;
/**
* 繼承於TextureProtocol
* - setBlendFunc
*/
//設置顏色混合模式
inline void setBlendFunc(const BlendFunc &blendFunc) override;
inline const BlendFunc& getBlendFunc() const override;
/**
* 繼承於Node
* - Scale , Position , Skew , AnchorPoint , Visible
* - addChild , removeChild , reorderChild , sortAllChildren
* - draw , setOpacityModifyRGB , isOpacityModifyRGB
*/
virtual void setScaleX(float scaleX) override;
virtual void setScaleY(float scaleY) override;
virtual void setScale(float scaleX, float scaleY) override;
virtual void setScale(float scale) override;
virtual void setPosition(const Vec2& pos) override;
virtual void setPosition(float x, float y) override;
virtual void setRotation(float rotation) override;
virtual void setPositionZ(float positionZ) override;
virtual void setSkewX(float sx) override;
virtual void setSkewY(float sy) override;
virtual void setRotationSkewX(float rotationX) override;
virtual void setRotationSkewY(float rotationY) override;
virtual void setAnchorPoint(const Vec2& anchor) override;
virtual void ignoreAnchorPointForPosition(bool value) override;
virtual void setVisible(bool bVisible) override;
virtual void addChild(Node *child, int zOrder, int tag) override;
virtual void addChild(Node *child, int zOrder, const std::string &name) override;
virtual void removeChild(Node* child, bool cleanup) override;
virtual void removeAllChildrenWithCleanup(bool cleanup) override;
virtual void reorderChild(Node *child, int zOrder) override;
virtual void sortAllChildren() override;
virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override;
virtual void setOpacityModifyRGB(bool modify) override;
virtual bool isOpacityModifyRGB(void) const override;
};
//