您好,登錄后才能下訂單哦!
【核心類】
導(dǎo)演Director、場景Scene、布景層Layer、精靈Sprite的概念請移步: cocos2dx基礎(chǔ)篇(3)——第一個程序HelloWorld
導(dǎo)演控制場景,場景控制圖層,圖層控制精靈,精靈控制動作。
相互之間的關(guān)系框架如下圖所示:
由此看出:
(1)整個游戲一般只有一個導(dǎo)演。
(2)一個游戲可以由多個場景組成(菜單界面、游戲界面、游戲結(jié)束界面等),但是每次導(dǎo)演只能指導(dǎo)一個場景的運(yùn)作。
(3)一個場景可以由多個圖層組成(背景層、道具層、英雄層、怪物層等,每個圖層都可以由多個精靈元素組成(標(biāo)簽、按鈕、菜單等)。
(4)對于圖層上的每個精靈元素,一般都附帶相應(yīng)的動作,可以帶多個動作。如揮刀、使用魔法、跑、跳,以及放大、縮小、旋轉(zhuǎn)等動作。
【導(dǎo)演Director】
就和現(xiàn)實中的導(dǎo)演一樣,這里的導(dǎo)演也是起到指導(dǎo)的作用的。導(dǎo)演在這里負(fù)責(zé)的就是讓不同的場景切換,控制整個游戲的流程,包括開始,繼續(xù),暫停等。以及設(shè)置、獲取系統(tǒng)信息,比如調(diào)整OpenGL相關(guān)的設(shè)置,獲取屏幕的大小等。
和Scene、Layer、Sprite等不同的是,導(dǎo)演類Director是直接繼承Ref類的,而不是Node類。
繼承關(guān)系如下:
主要函數(shù)如下:
// /** 導(dǎo)演類Director主要是用來: - 創(chuàng)建一個主窗口 - 管理場景Scene Director 也負(fù)責(zé)以下: - 初始化 OpenGL 內(nèi)容 - 設(shè)置 OpenGL 像素格式 (默認(rèn)值時 RGB565) - 設(shè)置 OpenGL 緩存大小 (默認(rèn)是 0-bit) - 設(shè)置 投影 (默認(rèn)是一個 3D) - 設(shè)置 方向 (默認(rèn)是豎屏Portrait) Director 是一個單例對象, 標(biāo)準(zhǔn)的調(diào)用方法是: - Director::getInstance()->methodName(); */ class CC_DLL Director : public Ref { /** * 獲取單例對象 */ //獲取全局唯一的Director實例 , 替代 sharedDirector //使用方法:Director::getInstance()->replaceScene(scene); static Director* getInstance(); /** * 場景管理相關(guān) * - runWithScene * - pushScene * - popScene , popToRootScene , popToSceneStackLevel * - replaceScene * - pause , resume , end * - getRunningScene , isPaused */ //指定進(jìn)入Director的主循環(huán)運(yùn)行的場景. //ps:僅在運(yùn)行第一個場景時調(diào)用,如果已經(jīng)存在運(yùn)行中的場景,不能調(diào)用本方法. //本方法調(diào)用后將調(diào)用pushScene方法,然后調(diào)用startAnimation. void runWithScene(Scene *scene); //將運(yùn)行中的場景暫停,并push到場景堆棧中,運(yùn)行新的場景. void pushScene(Scene *scene); //從場景堆棧中pop出一個場景,替換現(xiàn)在正運(yùn)行的場景,而運(yùn)行中的場景將被刪除. void popScene(); //從場景堆棧中pop出所有場景,最后一個棧底的場景將替換現(xiàn)在正運(yùn)行的場景,而運(yùn)行中的場景將被刪除. void popToRootScene(); //彈出從隊列中的所有場景,直到它到達(dá) level. //如果 level 是 0,它將結(jié)束 director. //如果 level 是 1, 從隊列中彈出所有的場景,直到只有根場景在隊列中. //如果 level <= 當(dāng)前的堆棧水平,它不會做任何事情。 void popToSceneStackLevel(int level); //使用新場景替換當(dāng)前場景,而運(yùn)行中的場景將被刪除. //PS:舊場景不壓入堆棧,而是直接刪除. void replaceScene(Scene *scene); void pause(void); //暫停場景 void resume(void); //恢復(fù)被暫停的場景 void end(void); //終止執(zhí)行,釋放運(yùn)行中的場景. GL view需手動移除. inline Scene* getRunningScene(); //獲取當(dāng)前運(yùn)行的場景 inline bool isPaused(); //Director 是否被暫停 /** * 刷新幀數(shù)FPS相關(guān) * - setAnimationInterval * - setDisplayStats * - getSecondsPerFrame , getTotalFrames */ //設(shè)置程序的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(); //獲取每秒執(zhí)行幀數(shù) inline float getSecondsPerFrame() //從 Director 開機(jī)后,總共已經(jīng)渲染了多少幀 inline unsigned int getTotalFrames(); /** * OpenGL圖形渲染相關(guān) * - setOpenGLView * - setProjection * - getTextureCache * - setViewport , setGLDefaultValues , setAlphaBlending , setDepthTest */ //獲取渲染所有東西的GLView void setOpenGLView(GLView *openGLView); inline GLView* getOpenGLView(); //設(shè)置一個 OpenGL 投影 // Projection::_2D : 設(shè)定的二維投影(正投影) // Projection::_3D : 使用 fovy=60, znear=0.5f and zfar=1500 設(shè)置一個3D投影 // Projection::CUSTOM : 投影委托里面它調(diào)用 "updateProjection". // Projection::DEFAULT = _3D : 默認(rèn)投影是 3D 投影 void setProjection(Projection projection); inline Projection getProjection(); TextureCache* getTextureCache() const; //獲取紋理緩沖 void setViewport(); //設(shè)置glViewport void setGLDefaultValues(); //設(shè)置 OpenGL 默認(rèn)值 void setAlphaBlending(bool on); //啟用/禁用 OpenGL alpha 混合 void setDepthTest(bool on); //啟用/禁用 OpenGL 深度測試 /** * OpenGL View視圖相關(guān) * - getWinSize * - getVisibleSize , getVisibleOrigin * - convertToGL , convertToUI */ //類似手機(jī)屏幕的大小 const Size& getWinSize() const; //獲取OpenGL view大小,單位點. Size getWinSizeInPixels() const; //獲取OpenGL view大小,單位像素. //類似程序的游戲區(qū)域 //如果不調(diào)用GLView::setDesignResolutionSize(), 值等于getWinSize Size getVisibleSize() const; //獲取OpenGL View可視區(qū)域大小,單位點. Vec2 getVisibleOrigin() const; //獲取可視區(qū)域的原點坐標(biāo). //將UIKit坐標(biāo)與OpenGL坐標(biāo)的相互轉(zhuǎn)換 //UIKit坐標(biāo) :原點在屏幕的左上角. 從左到右,從上到下. //OpenGL坐標(biāo):原點在屏幕的左下角. 從左到右,從下到上. Vec2 convertToGL(const Vec2& point); //轉(zhuǎn)為GL坐標(biāo) Vec2 convertToUI(const Vec2& point); //轉(zhuǎn)為UI坐標(biāo) /** * 其他操作 * - purgeCachedData * - getRenderer * - setDefaultValues * - setScheduler , setActionManager , setEventDispatcher */ void purgeCachedData(); //移除所有 cocos2d 緩存數(shù)據(jù). Renderer* getRenderer() const; //獲取渲染器(Renderer). v3.0 void setDefaultValues(); //設(shè)置配置信息的默認(rèn)值 void setScheduler(Scheduler* scheduler); //設(shè)置與director關(guān)聯(lián)的調(diào)度器 void setActionManager(ActionManager* actionManager); //設(shè)置與director關(guān)聯(lián)的ActionManager void setEventDispatcher(EventDispatcher* dispatcher); //設(shè)置與director關(guān)聯(lián)的EventDispatcher. v3.0 Scheduler* getScheduler() const; ActionManager* getActionManager() const; EventDispatcher* getEventDispatcher() const; } //
【場景Scene】
Scene是繼承與Node類的。作為場景類,它卻只有函數(shù)create。因為場景就像是一個容器,將不同的布景層(Layer)組合在一起,方便管理。
一個游戲會有很多的場景,比如,主界面,游戲界面,載入界面等等都是一個場景。而每一個場景都是由多個圖層組合在一起,形成一個完整的游戲畫面。
其實在 cocos2dx基礎(chǔ)篇(3)——第一個程序HelloWorld 中就出現(xiàn)了Scene的創(chuàng)建,以及將HelloWorld布景層放入該Scene中。
繼承關(guān)系如下:
主要函數(shù)如下:
// 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)可以包含多個元素,如標(biāo)簽(Label)、菜單(Menu)、精靈(Sprite)等等。
和2.x對比,3.2版本的Layer做了很大的改動:將觸控函數(shù) ccTouch 改為 onTouch ,還棄用了好多加速度計、鍵盤輸入事件相關(guān)操作函數(shù)。
并且對于觸控、加速度計、鍵盤輸入的事件回調(diào)函數(shù),將通過3.x中新的事件分發(fā)機(jī)制來完成。
注意:Layer的錨點默認(rèn)為(0,0),即左下角。并且忽略錨點的設(shè)置,即使你setAnchorPoint了錨點,Layer的錨點也不會改變,依然是(0,0)。
繼承關(guān)系如下:
主要函數(shù)如下:
// class CC_DLL Layer : public Node { /** * 創(chuàng)建布景層 * - create */ static Layer *create(); /** * 觸控相關(guān) * - 單點觸控 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); /** * 加速度計相關(guān). 即重力感應(yīng). * - Acceleration為加速度計信息 * - class Acceleration : public Ref { double x , y , z , timestamp; }; */ //加速度計監(jiān)聽事件回調(diào)函數(shù) virtual void onAcceleration(Acceleration* acc, Event* unused_event); /** * 鍵盤輸入相關(guān) * - KeyCode : 為鍵盤按下了那個鍵. * - 舉例 : KEY_BACKSPACE, KEY_ALT, KEY_F1, KEY_0, KEY_A,... * - 詳情參照: "\cocos\base\CCEventKeyboard.h" */ //按下鍵盤, 監(jiān)聽事件回調(diào)函數(shù) virtual void onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event); //釋放鍵盤, 監(jiān)聽事件回調(diào)函數(shù) virtual void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event); }; //
【精靈Sprite】
精靈說簡單一點,其實就是一個2D的圖片。并賦予圖片各種屬性以及特性。如大小、顏色、放縮、旋轉(zhuǎn)、動作等。精靈一般都是放在布景層(Layer)上面的,即一個布景層(Layer)應(yīng)當(dāng)有許多的精靈存在。精靈可以用來當(dāng)做背景、人物、鳥、白云等內(nèi)容。
Sprite不僅繼承了Node,還繼承了紋理協(xié)議接口TextureProtocol。
TextureProtocol紋理協(xié)議接口主要是負(fù)責(zé)紋理圖片的管理。
注意:精靈的錨點默認(rèn)為(0.5,0.5),即中心點。
繼承關(guān)系如下:
主要函數(shù)如下:
// /** Sprite定義為二維圖像, 可以通過一個圖像或一個圖像的矩形裁剪部分創(chuàng)建Sprite. - 為了優(yōu)化Sprite渲染,請遵循以下最佳用法: - 所有Sprite放入同一個SpriteSheet - 所有Sprite使用相同的渲染混合函數(shù)(BlendFunc) - 使得渲染器(Renderer)自動批量處理("batch")Sprite (將會在一次OpenGL調(diào)用內(nèi)繪制完成) - 為了獲得額外5%~10的渲染優(yōu)化效果,你可以把Sprite作為子節(jié)點加入到SpriteBatchNode中, - 但這么做有以下限制: - Alias/Antialias屬性屬于SpriteBatchNode,不能單獨設(shè)置Sprite的Alias屬性。 - 渲染混合函數(shù)(BlendFunc)屬于SpriteBatchNode,不能單獨設(shè)置Sprite的渲染混合函數(shù)(BlendFunc)。 - 不支持ParallaxNode,不過可以使用代理("proxy")Sprite模擬實現(xiàn)。 - Sprite的子節(jié)點只能是其它Sprite(或Sprite的子類) - Sprite的默認(rèn)錨點(anchorPoint)為(0.5, 0.5)。 */ class CC_DLL Sprite : public Node, public TextureProtocol { /** * 創(chuàng)建方法 * - create * - createWithTexture * - createWithSpriteFrame */ static Sprite* create(); //默認(rèn)創(chuàng)建空精靈對象 static Sprite* create(const std::string& filename); //圖片文件(*.png) static Sprite* create(const std::string& filename, const Rect& rect); //截取圖片文件中某一區(qū)域圖片 static Sprite* createWithTexture(Texture2D *texture); //紋理圖片 static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false); //截取紋理圖片中某一區(qū)域圖片,是否旋轉(zhuǎn) static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame); //精靈幀. 精靈幀一般從plist中讀取的 static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName); //精靈幀的名字 /** * 批處理節(jié)點BatchNode * - updateTransform * - setBatchNode * - getBatchNode */ virtual void updateTransform(void); //更新四個值:position(x,y), rotation, scale virtual void setBatchNode(SpriteBatchNode *spriteBatchNode); //設(shè)置批節(jié)點,不推薦手工調(diào)用 virtual SpriteBatchNode* getBatchNode(void); //如果精靈是由批節(jié)點渲染,則返回批節(jié)點 /** * 紋理Texture * - setTexture * - setTextureRect */ //設(shè)置精靈的紋理圖片. virtual void setTexture(const std::string &filename ); //調(diào)用setTextureRect設(shè)置Sprite尺寸 virtual void setTexture(Texture2D *texture) override; //紋理的矩形尺寸大小不會改變 virtual Texture2D* getTexture() const override; //設(shè)置Sprite紋理(texture)的Rect尺寸(rect)、是否旋轉(zhuǎn)(rotated)、裁剪尺寸(untrimmedSize)。 //調(diào)用此方法會修改紋理(texture)的坐標(biāo)和頂點位置 virtual void setTextureRect(const Rect& rect, bool rotated = false, const Size& untrimmedSize = rect.size); /** * 精靈幀SpriteFrames & 動畫Animation * - setSpriteFrame * - isFrameDisplayed * - getSpriteFrame * - setDisplayFrameWithAnimationName */ //設(shè)置新的顯示精靈幀. 替代setDisplayFrame virtual void setSpriteFrame(const std::string &spriteFrameName); virtual void setSpriteFrame(SpriteFrame* newFrame); //返回精靈幀是否正在顯示 virtual bool isFrameDisplayed(SpriteFrame *pFrame) const; //返回當(dāng)前顯示的精靈幀. 替代 getDisplayFrame virtual SpriteFrame* getSpriteFrame() const; //通過動畫幀的第frameIndex那一幀來設(shè)置顯示精靈幀 //動畫幀是從CCAnimationCache中讀取的 virtual void setDisplayFrameWithAnimationName(const std::string& animationName, ssize_t frameIndex); /** * 精靈屬性相關(guān) * - setDirty * - getQuad * - isTextureRectRotated * - setAtlasIndex * - getTextureRect * - setTextureAtlas * - getOffsetPosition * - setFlippedX , setFlippedY */ //設(shè)置Sprite在紋理集Atlas中是否需要更新 virtual void setDirty(bool dirty); virtual bool isDirty(void) const; //返回四個值的信息:坐標(biāo)(x,y),頂點,顏色 inline V3F_C4B_T2F_Quad getQuad(void) const; //判斷紋理是否被旋轉(zhuǎn) inline bool isTextureRectRotated(void) const; //設(shè)置紋理集(TextureAtlas)的當(dāng)前使用索引 //警告: 除非你了解調(diào)用此方法的影響,否則不要改變此值 inline void setAtlasIndex(ssize_t atlasIndex); inline ssize_t getAtlasIndex(void) const; //返回Sprite的Rect區(qū)域信息,單位點 inline const Rect& getTextureRect(void); //如果采用批渲染,設(shè)置紋理地圖集 inline void setTextureAtlas(TextureAtlas *pobTextureAtlas); inline TextureAtlas* getTextureAtlas(void); //獲取偏移值 inline const Vec2& getOffsetPosition(void) const; //設(shè)置是否翻轉(zhuǎn)。 void setFlippedX(bool flippedX); //設(shè)置Sprite是否水平翻轉(zhuǎn)。替代 setFlipX bool isFlippedX(void) const; void setFlippedY(bool flippedY); //設(shè)置Sprite是否垂直翻轉(zhuǎn)。替代 setFlipY bool isFlippedY(void) const; /** * 繼承于TextureProtocol * - setBlendFunc */ //設(shè)置顏色混合模式 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; }; //
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。