Cocos2d-X遊戲開發
-
節點
對象關係圖:
節點(Node)是Cocos2d-x中最重要的類,繼承自Ref類,同時也是所有節點的父類。
Cocos2d-x看所有需要繪製到屏幕的對象,或是自身包含要繪製到屏幕中的對象,都繼承自Node類,最常用的節點包括場景、層、精靈和菜單等,每一個節點只有一個父節點,但是可以有任意數量的子節點。
成員變量:
名稱 |
功能 |
_rotationX |
表示節點X軸的水平旋轉的角度,節點以錨點爲中心順時針旋轉一定量,單位是角度。 |
_rotationY |
表示節點y軸的垂直旋轉的角度,節點以錨點爲中心順時針旋轉一定量,單位是角度。 |
_scaleX |
表示節點X軸的縮放比例,節點以錨點爲中心縮放該比例。 |
_scaleY |
表示節點Y軸的縮放比例,節點以錨點爲中心縮放該比例。 |
_position |
表示節點在屏幕中的位置。 |
_skewX |
表示節點X軸的傾斜解度,節點以錨點爲中心,平行X軸順時針變形,單位爲角度,默認值爲0 |
_skewY |
表示節點y軸的傾斜解度,節點以錨點爲中心,平行y軸逆時針變形,單位爲角度,默認值爲0 |
_anchorPoint |
表示節點的錨點,用於精確地控制節點的位置和位置的變換,節點的變形和定位操作都要依據錨點來確定。 |
_contentSize |
表示未經轉換的節點內容大小,以point(點)爲單位。 |
_globalZOrder |
表示節點相對於其"兄弟"節點(擁有共同的父節點)的Z順序值。 |
_children |
節點的子節點數組,變量類型是Vector<Node*>. |
_parent |
節點的父節點,通常很少用到。變量類型是Node. |
_tag |
用於識別節點的標識值。 |
_userData |
獲取或設置與節點相關的額外信息,變量是一個void的指針對象,表示不確定的對象,可以是一個數據塊、一個結構或一個對象等,我們可以利用這個屬性來保存任何數據。 |
_visible |
用於判斷節點是否可見。 |
_running |
當使用同樣的Z值對子節點進行排序時,用該成員變量來決定子節點的順序,不要手動更改改數值。 |
_orderOfArrival |
用於判斷當前節點是否在運行。 |
成員方法:
名稱 |
類型 |
功能 |
virtual void addChild(Node* childNode) |
處理子節點 |
將新節點添加爲當前場景節點的子節點,z-order的值爲0 |
virtual void addChild(Node* child,int localZOrder,int tag) |
處理子節點 |
將新節點添加爲當前場景節點的子節點並設置子節點的Z值。 |
virtual void addChild(Node* child,int localZOrder) |
處理子節點 |
將新節點添加爲當前場景節點的子節點並設置子節點的Z值和tag值。 |
Node *getChildByTag(int tag) |
處理子節點 |
使用場景容器的tag獲取子節點 |
virtual Vector<Node*>&getChildren() |
處理子節點 |
獲取所有子節點 |
virtual void removeChildByTag(int tag,bool cleanup=true) |
處理子節點 |
通過tag刪除子節點。 |
virtual void removeChild(Node* child, bool cleanup=true) |
處理子節點 |
通過節點指針刪除子節點。 |
virtual void removeAllChildern() |
處理子節點 |
刪除節點的所有子節點。 |
Action* runAction(Action* action) |
動作 |
運行某個特定的動作,並返回執行的動作。 |
void stopAction(Action* action) |
動作 |
從運行的動作列表中停止和刪除一個特定的動作。 |
void stopActionByTag(int tag) |
動作 |
根據tag值從運行的動作列表停止和刪除一個特定的動作。 |
void stopAllActions() |
動作 |
從運行的動作列表中停止和刪除所有的動作。 |
Action* getActionByTag(int tag) |
動作 |
根據tag值從運行的動作列表中獲得一個特定的動作。 |
void scheduleUpdate() |
定時器事件 |
啓用定時器回調更新函數,該函數每一幀都會被調用。 |
void schedule(SEL_SCHEDULE selector,float interval) |
定時器事件 |
如果需要根據不同的時間間隔來觸發不同的定時更新邏輯,就需要指定運行特定的更新函數。 |
void scheduleOnce(SEL_SCHEDULE selector,float delay) |
定時器事件 |
指定運行特定的更新函數,並設置調用的延遲時間,但只運行一次 |
void unscheduleUpdate() |
定時器事件 |
停止scheduleUpdate中設置的預定更新函數update |
void unscheduleUpdate(SEL_SCHEDULE selector) |
定時器事件 |
停止指定運行的特定更新函數 |
virtual bool int() |
其它 |
該函數用於初始化節點,返回bool值,表示是否成功。 |
virtual void onEnter() |
其它 |
當節點所在的場景即將呈現時調用。 |
virtual void onExitTransitionDidStart() |
其它 |
當節點所在場景的出場過渡效果結束後調用,如果沒有過渡效果,則緊接着onExit()後被調用。 |
virtual void cleanup() |
其它 |
函數用於停止所有運行中的動作和定時器函數 |
virtual void draw() |
其它 |
重寫該函數以繪製自己的節點 |
-
導演
在Cocos2d-x中,把統籌遊戲大局的類抽象爲導演類(Director),Director是整個cocos2d-x引擎的核心,是整個遊戲的導航儀。遊戲中的一些常用操作就是由Director來控制的,比如OpenGL ES的初始化,場景的轉換,遊戲暫停繼續的控制,世界座標和GL座標之間的切換,對節點的控制等,還有一些遊戲數據的保存調用,屏幕尺寸的獲取等都要由Director類來管理控制的。
因爲Director是遊戲項目的總導演,會經常調用進行一些控制,所以該Director利用了單件設計模式,也就是整個遊戲裏只有一個導演類。用getInstance()方法取得Director的實例。
//創建一個導演類的單例
Director* pDirector = Director::getInstance();
getVisibleSize:獲得可視區域的大小。若是設計分辨率跟屏幕尺寸一樣大,則getVisibleSize便是getWinSize。
getWinSize:獲取屏幕大小。
getVisibleOrigin:表示可視區域的起點座標。
另外還有一個就是Node節點裏面的getContentSize()函數。
getContentSize:來獲得節點(Node)原始的大小。只是邏輯尺寸,不是像素
//獲取屏幕大小
autovisibleSize = Director::getInstance()->getVisibleSize();
Vec2origin = Director::getInstance()->getVisibleOrigin();
-
場景
在遊戲裏,場景就是關卡。關卡由人物角色和背景構成。在電影裏,場景就是電影中的各種場面,各種場面主要由人物活動和背景等構成。而在Cocos2d-x 引擎中,場景存放的是需要渲染的佈景,任務角色和菜單,它可以作爲一個整體,一起渲染,一起銷燬,一起被場景切換使用。
即遊戲關卡的實施者,其管理這多個Layer,進行場景展現,相關業務邏輯的處理等;
一個場景就是一個界面,定義了所顯示的所有角色圖層信息
Scene(場景)是一個抽象的概念,僅被用作Node(節點)的一個子類。Scene(場景)和Node(節點)幾乎相同,不同的是Scene的默認錨點在屏幕的中心。現在 scene 沒有其它的邏輯,不需要我們做太多的操作及處理,更多的操作處理基本都是在佈景層上完成。
//創建場景
autoscene = Scene::create();
//創建圖層對象
autolayer = StartLayer::create();
//將圖層添加到場景
scene->addChild(layer);
-
圖層
Layer是處理玩家事件響應的Node子類。與場景不同,層通常包含的是直接在屏幕上呈現的內容,並且可以接受用戶的輸入事件,包括觸摸、鍵盤輸入等。我們需要在層中加入Sprite(精靈)、文本標籤或者其它遊戲元素,並設置遊戲元素的屬性,比如位置、方向和大小;設置遊戲元素的動作等。在我們設計好層以後,只需要把層按照順序添加到場景中就可以顯示出來了。一個場景中有多個可以交互的圖層,每層顯示不同的角色信息,Layer層一方面作爲容器使用,另一方面處理相關事件的響應(如觸摸點擊、用戶輸入等)。
//創建一個層
auto layer = StartLayer::create();