Cocos2D研究院之CCNode详解(三)
http://www.xuanyusong.com/archives/950
上一章我們了解了cocos2d的項(xiàng)目路徑以及工作原理,這次作者要真刀真槍地講解代碼了,咱們先來看看cocos2d最常用、也是作者認(rèn)為最核心的類——CCNode。
之前說過,cocos2d的所有類都以CC開頭,那么實(shí)際上這個類的名字就是Node,類如其名,這個類的實(shí)例就是一個節(jié)點(diǎn)。Cocos2d的類是樹狀繼承的,而在內(nèi)存中,各個實(shí)例之間也是以“樹”這種數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián)的。,可見樹在cocos2d中的重要性,難怪某位偉人說“要致富,少生孩子多種樹”……(霧)所以如果有童鞋對樹不太了解的話,建議去看看數(shù)據(jù)結(jié)構(gòu),相信會對你的編碼有幫助。(在后面的文章中,作者均以讀者了解樹的相關(guān)知識為前提來講解)
在實(shí)際應(yīng)用中,除了根節(jié)點(diǎn)外,每一個節(jié)點(diǎn)都有一個父節(jié)點(diǎn),任何節(jié)點(diǎn)都可以存在N個子節(jié)點(diǎn),結(jié)構(gòu)圖如下:
圖中的每個圓圈都是一個節(jié)點(diǎn)(即CCNode實(shí)例),圓圈中的數(shù)字是它們的編號,所有的節(jié)點(diǎn)組合到一起形成了一個樹。我們可以看到,1是這個樹的根節(jié)點(diǎn),因?yàn)樗鼪]有父節(jié)點(diǎn),其余所有節(jié)點(diǎn)都是它直接或間接的子節(jié)點(diǎn),2和3是1的子節(jié)點(diǎn),4和5是2的子節(jié)點(diǎn),6是3的子節(jié)點(diǎn)。它們通過彼此間的連線可以找到對方,就是說2知道1是它的父節(jié)點(diǎn),4和5是它的子節(jié)點(diǎn),但并不知道3是它的“兄弟”(沒有連線),只能通過1間接的尋找,因此這種“關(guān)聯(lián)”效率是最低的,且沒有泛用性,在開發(fā)中應(yīng)盡量避免。
上一章的最后提到過,場景是容納所有演員的大舞臺,只有加入場景的元素才會被顯示到屏幕上,那么如果圖中的樹是一個能夠正確運(yùn)行的體系,1一定是一個場景,2和3有可能是層,后面就是一系列的“演員”。可能有的童鞋會問:場景和層是什么類,它們不是CCNode,為什么能作為它們的父節(jié)點(diǎn),加入到樹中呢?其實(shí)答案我在上一章也說過,cocos2d的類是一層一層繼承下來的,它們擁有共通的接口(都是在CCNode聲明的),場景類是CCScene,層類是CCLayer,它們都是CCNode的子類,就是說它們實(shí)際上也是一個node,完全可以放置在樹的任何位置。像這樣的例子在cocos2d中還有很多(比如精靈),所以說CCNode是cocos2d的核心一點(diǎn)也不為過。
了解了CCNode的重要性,接下來我們就一起研究下它的內(nèi)部結(jié)構(gòu)吧~
首先我們先看看它有哪些屬性:(它繼承自NSObject,因此它與Foundation框架的兼容性完全不用擔(dān)心= =)
float rotation_
節(jié)點(diǎn)的旋轉(zhuǎn)角度,如果是圖片的話,會看到旋轉(zhuǎn)效果,所以基本上是為屏幕輸出服務(wù)的。
float scaleX_, scaleY_
節(jié)點(diǎn)的縮放比例,X為橫向,Y為縱向,當(dāng)值為1的時候表示原比例,0.5表示縮小一半,2表示放大1倍,如果是圖片的話就會看到效果,也是為屏幕輸出服務(wù)的。
CGPoint position_
節(jié)點(diǎn)的坐標(biāo),該屬性是一個結(jié)構(gòu)體,position_.x是它的橫坐標(biāo),position_.y是縱坐標(biāo),基本上也是要顯示到屏幕上才有意義。
float skewX_, skewY_
節(jié)點(diǎn)的扭曲角度,類似于Windows畫圖板中的扭曲功能,X是橫向扭曲,Y是縱向扭曲,單位是度數(shù),也是屏顯用的。
CGPoint anchorPointInPoints_
節(jié)點(diǎn)的錨點(diǎn)坐標(biāo),所謂錨點(diǎn)就是當(dāng)旋轉(zhuǎn)、縮放或是用其它方式操作節(jié)點(diǎn)時的參考的基準(zhǔn)點(diǎn),例如圖片的錨點(diǎn)在正中心,當(dāng)放大它的時候,圖片就會向四周擴(kuò)散,當(dāng)旋轉(zhuǎn)一個錨點(diǎn)在左上角的圖片時,圖片就會以左上角為軸旋轉(zhuǎn)。
CGPoint anchorPoint_
節(jié)點(diǎn)的錨點(diǎn)在節(jié)點(diǎn)位置的比例,比如說一個節(jié)點(diǎn)的坐標(biāo)為(0, 0),寬高各為100,那么當(dāng)它的錨點(diǎn)坐標(biāo)為(50, 50)的時候,anchorPoint_.x = 0.5,anchorPoint_.y = 0.5。
CGSize contentSize_
節(jié)點(diǎn)的寬高,它也是一個結(jié)構(gòu)體,contentSize_.width表示寬,contentSize_.height表示高,它和position_配合可以用來檢測碰撞,但需要注意,contentSize_不會因?yàn)楣?jié)點(diǎn)的旋轉(zhuǎn)和縮放而改變大小。
CCCamera *camera_
節(jié)點(diǎn)的鏡頭,cocos2d雖然是2D游戲引擎,但實(shí)際上它是通過3D方式繪制2D效果的,因此有鏡頭存在就不奇怪了。CCCamera也是cocos2d的一個類,它默認(rèn)情況下是正對著節(jié)點(diǎn)的,距離也是剛好使節(jié)點(diǎn)能夠以1:1的比例顯示到屏幕上,當(dāng)我們手動修改它的參數(shù)后,節(jié)點(diǎn)就會呈現(xiàn)出歪曲或縮放等效果。
NSInteger zOrder_
節(jié)點(diǎn)的Z軸,當(dāng)有多個節(jié)點(diǎn)在屏幕顯示時,引擎會根據(jù)它們Z軸的大小決定繪制順序,Z軸大的會蓋住Z軸小的。
CCArray *children_
重頭戲來了,前面說過節(jié)點(diǎn)可以有N個子節(jié)點(diǎn),children_就是存儲這些子節(jié)點(diǎn)地址的變量,節(jié)點(diǎn)就是通過它們找到自己的子節(jié)點(diǎn)的。children_的類型是CCArray,這是cocos2d自己封裝的一個數(shù)組類,每個元素存儲一個子節(jié)點(diǎn)地址,它引入了tag機(jī)制,當(dāng)節(jié)點(diǎn)有多個子節(jié)點(diǎn)時,可以根據(jù)它們的tag找到自己想要的那一個。
CCNode *parent_
另一個重點(diǎn)——節(jié)點(diǎn)的父節(jié)點(diǎn)。因?yàn)闃渲械拿總€節(jié)點(diǎn)都繼承自CCNode,所以用CCNode類型定義父節(jié)點(diǎn)是最萬無一失的,節(jié)點(diǎn)可以通過它找到自己的父節(jié)點(diǎn),因?yàn)楦腹?jié)點(diǎn)最多只有一個,所以不需要用數(shù)組保存。
NSInteger tag_
節(jié)點(diǎn)的標(biāo)簽,主要是幫助其父節(jié)點(diǎn)找到自己,因?yàn)槊總€節(jié)點(diǎn)的子節(jié)點(diǎn)并不一定是唯一的,當(dāng)需要遍歷時可以用該參數(shù)做區(qū)分,所以兄弟節(jié)點(diǎn)的標(biāo)簽盡量不要一樣。
Bool isRunning_
表示節(jié)點(diǎn)是否在更新邏輯,之前說過,未加入樹的節(jié)點(diǎn)是不會顯示到屏幕上的,其實(shí)它的邏輯運(yùn)算也是一樣,就是說沒有父節(jié)點(diǎn)的節(jié)點(diǎn)不會顯示,也不會處理自己的邏輯,它的一切活動都會停止。那么當(dāng)節(jié)點(diǎn)被加入到樹中的時候,isRunning_會被自動置為Yes,此時它會開始執(zhí)行自己的運(yùn)算,當(dāng)節(jié)點(diǎn)離開樹時,isRunning_會被置為No,如果想在它在樹中的時候暫停運(yùn)算,就需要將它的isRunning_手動置為No。
Bool visible_
和isRunning_對應(yīng),用來表示節(jié)點(diǎn)是否在繪制,當(dāng)visible_為No時,節(jié)點(diǎn)即使在樹中也不會繪制到屏幕上,就相當(dāng)于隱藏了起來。
以上就是CCNode比較重要的屬性,不過我們在開發(fā)中直接操作它們的頻率并不高,而是通過類中聲明的相關(guān)方法去改變它們,下面我就來說說CCNode中的方法。
+(id) node
實(shí)例化一個CCnode對象,實(shí)際上就是封裝了alloc、init和autorelease方法。
-(id) init
初始化,將一些數(shù)值型的參數(shù)歸0,縮放比例設(shè)為1,指針型的參數(shù)設(shè)為nil。
-(CCArray*) children
返回對象的children_,即獲取全部的子節(jié)點(diǎn)。
-(Bool) visible
返回visible_參數(shù),用于檢測該節(jié)點(diǎn)當(dāng)前是否被繪制。
-(void) setVisible: (Bool)visible
設(shè)置節(jié)點(diǎn)的繪制狀態(tài),Yes為可見,No為不可見
-(CCNode*) parent
返回節(jié)點(diǎn)的parent_,即獲取父節(jié)點(diǎn)
-(void) setParent: (CCNode*)parent
設(shè)置父節(jié)點(diǎn),但實(shí)際應(yīng)用中不要這樣修改,因?yàn)闃O易出bug,正確的修改方法會在后面介紹。
-(NSInteger) tag
返回對象的tag_,即獲取節(jié)點(diǎn)的標(biāo)簽。
-(NSInteger) zOrder
返回對象的zOrder_,即獲取Z軸。
-(Bool) isRunning
返回對象的isRunning_,即檢測該節(jié)點(diǎn)當(dāng)前是否更新邏輯。
-(float) rotation
返回對象的rotation_,即獲取節(jié)點(diǎn)的旋轉(zhuǎn)角度。
-(void) setRotation: (float)rotation
設(shè)置對象的rotation_值,即旋轉(zhuǎn)節(jié)點(diǎn)。
-(CGPoint) position
返回對象的position_,即獲取節(jié)點(diǎn)的坐標(biāo)。
-(void) setPosition: (CGPoint)position
設(shè)置對象的position_,即更改節(jié)點(diǎn)的坐標(biāo)。
-(CGPoint) anchorPoint
返回對象的anchorPoint_,即獲取節(jié)點(diǎn)的錨點(diǎn)。
-(void) setAnchorPoint: (CGPoint)anchorPoint
設(shè)置對象的anchorPoint_,即修改節(jié)點(diǎn)的描點(diǎn)。
-(CGSize) contentSize
返回對象的contentSize_,即獲取節(jié)點(diǎn)的寬高。
-(void) setContentSize: (CGSize)contentSize
設(shè)置對象的contentSize_,即改變節(jié)點(diǎn)的寬高。
-(float) skewX
返回對象的skewX_,即獲取節(jié)點(diǎn)的橫向扭曲角度。
-(void) setSkewX: (float)skewX
設(shè)置對象的skewX_,即設(shè)置節(jié)點(diǎn)的橫向扭曲角度。
-(float) skewY
返回對象的skewY_,即獲取節(jié)點(diǎn)的縱向扭曲角度。
-(void) setSkewY: (float)skewY
設(shè)置對象的skewY_,即設(shè)置節(jié)點(diǎn)的縱向扭曲角度。
-(float) scaleX
返回對象的scaleX_,即獲取節(jié)點(diǎn)的橫向縮放比例。
-(void) setScaleX: (float)scaleX
設(shè)置對象的scaleX_,即橫向縮放節(jié)點(diǎn)。
-(float) scaleY
返回對象的scaleY_,即獲取節(jié)點(diǎn)的縱向縮放比例。
-(void) setScaleY: (float)scaleY
設(shè)置對象的scaleY_,即縱向縮放節(jié)點(diǎn)。
-(CGRect) boundingBox
返回對象的碰撞框(由坐標(biāo)和寬高組合而成),這個參數(shù)會隨著節(jié)點(diǎn)的縮放或旋轉(zhuǎn)等操作而改變。
-(CCCamera*) camera
返回對象的camera_,即獲取節(jié)點(diǎn)的鏡頭。
-(CCNode*) getChildByTag: (NSInteger) aTag
根據(jù)tag_返回children_數(shù)組中的某個元素,即根據(jù)標(biāo)簽獲取節(jié)點(diǎn)的某個子節(jié)點(diǎn)。
-(void) addChild: (CCNode*)child z: (NSInteger)z tag: (NSInteger)aTag
向children_數(shù)組中添加一個CCNode對象,即給節(jié)點(diǎn)添加一個子節(jié)點(diǎn),z是子節(jié)點(diǎn)的Z軸,aTag是子節(jié)點(diǎn)的標(biāo)簽,此方法會將該子節(jié)點(diǎn)的parent_指針指向自己,因此這才是設(shè)置父節(jié)點(diǎn)的正解,比setParent要安全的多。
-(void) addChild: (CCNode*)child z: (NSInteger)z
-(void) addChild: (CCNode*)child
缺省了tag或z的添加子節(jié)點(diǎn)方法,缺省值默認(rèn)為0。
-(void) removeFromParentAndCleanup: (Bool)cleanup
將節(jié)點(diǎn)從它的父節(jié)點(diǎn)的children_數(shù)組中刪除,即脫離樹,cleanup表示是否將其從內(nèi)存中清除。
-(void) removeChild: (CCNode*)child cleanup: (Bool)cleanup
將某一節(jié)點(diǎn)從children_數(shù)組中刪除,即刪除某一子節(jié)點(diǎn)。
-(void) removeChildByTag: (NSInteger)aTag cleanup: (Bool)cleanup
根據(jù)tag_刪除children_數(shù)組中的某個元素,即根據(jù)標(biāo)簽刪除節(jié)點(diǎn)的某個子節(jié)點(diǎn)。
-(void) removeAllChildrenWithCleanup: (Bool)cleanup
清空對象的children_數(shù)組,即刪除所有子節(jié)點(diǎn)。
-(void) _setZOrder: (NSInteger)z
設(shè)置對象的zOrder_,即改變節(jié)點(diǎn)的Z軸。
-(void) reorderChild: (CCNode*)child z: (NSInteger)z
將某節(jié)點(diǎn)從子節(jié)點(diǎn)隊(duì)列中取出,并重新重新插入隊(duì)列,目的是改變其Z軸。
-(void) visit
繪制函數(shù),用來將節(jié)點(diǎn)內(nèi)容(多為圖片或文字)顯示到屏幕。
-(void) onEnter
相當(dāng)于一個激活過程,它會在節(jié)點(diǎn)被添加到樹中的時候執(zhí)行,使其可以更新自己的邏輯。
-(void) onExit
取消激活,作用是暫停某節(jié)點(diǎn)的邏輯更新。
-(CCAction*)runAction: (CCAction*)action
一個會經(jīng)常被用到的類,作用是執(zhí)行一種行為,行為模式由參數(shù)action決定,CCAction就是上一章提到的行為類,runAction就是聯(lián)系實(shí)體類和行為類的橋梁。行為執(zhí)行完畢后,action會自動釋放(用了autorelease),所以使用時不用擔(dān)心內(nèi)存問題。但需要注意,當(dāng)isRunning_為No時,節(jié)點(diǎn)執(zhí)行的行為會暫停,就是說onExit有暫停節(jié)點(diǎn)一切行為的功能。
-(void) stopAllActions
停止節(jié)點(diǎn)正在執(zhí)行的所有行為,注意這里是停止,不是暫停,函數(shù)執(zhí)行后節(jié)點(diǎn)中的所有行為類實(shí)例都將從內(nèi)存中清除。
-(void) stopAction: (CCAction*)action
停止節(jié)點(diǎn)的某一個行為,如果沒有執(zhí)行該行為則什么都不做。
-(void) stopActionByTag: (NSInteger)aTag
根據(jù)標(biāo)簽停止節(jié)點(diǎn)的某一個行為。
-(CCAction*) getActionByTag: (NSInteger)aTag
根據(jù)標(biāo)簽獲取某個正在執(zhí)行的行為。
-(void) schedule: (SEL)selector interval: (ccTime)interval
Schedule是cocos2d中的一個很重要的機(jī)制,在作者看來它的實(shí)用性僅次于行為類,它的功能和CCAction有相似的地方,都是執(zhí)行一種行為;不同之處在于,schedule是通過調(diào)用方法來執(zhí)行邏輯的,而且他它內(nèi)部還有個計(jì)時器,可以每隔一定的時間調(diào)用一次,反復(fù)循環(huán),直到手動將其停止或者節(jié)點(diǎn)被刪除(暫停)。這里的參數(shù)selector就是執(zhí)行的方法,interval是間隔時間(秒),ccTime其實(shí)就是一個浮點(diǎn)數(shù)。
-(void) unschedule: (SEL)selector: (SEL)selector
停止一個schedule任務(wù),注意這里是停止不是暫停。
-(void) unscheduleAllSeletors
停止所有schedule任務(wù)
-(void) resumeSchedulerAndActions
恢復(fù)運(yùn)行節(jié)點(diǎn)的行為和schedule。
-(void) pauseSchedulerAndActions
暫停節(jié)點(diǎn)的行為和schedule。
以上就是實(shí)體類的常用參數(shù)和方法,希望能對你學(xué)習(xí)cocos2d有所幫助。有一點(diǎn)要特別提醒一下,當(dāng)節(jié)點(diǎn)執(zhí)行了一個set開頭的方法(即賦值方法)或某種行為時,產(chǎn)生的效果并不僅限于該節(jié)點(diǎn),也包括它的所有子節(jié)點(diǎn),以開頭的示例圖為例,當(dāng)節(jié)點(diǎn)1執(zhí)行了setPosition方法后,節(jié)點(diǎn)1、2、3、4、5、6都會發(fā)生位移,但如果是節(jié)點(diǎn)2執(zhí)行的setPosition,那么只有節(jié)點(diǎn)2、4、5會移動,節(jié)點(diǎn)1、3、6不會受影響。善用這點(diǎn)的話會使開發(fā)更加省力,反之則會給自己增添不少麻煩,所以在設(shè)計(jì)樹的結(jié)構(gòu)時需要動些腦筋(當(dāng)然作者認(rèn)為這樣還是利大于弊的)。
有了CCNode,自然還要學(xué)CCAction,那么下一章我就帶大家了解一下這個類,掌握了它們之后,我會寫一些例子,以便加深了解。
- 本文固定鏈接:?http://www.xuanyusong.com/archives/950
- 轉(zhuǎn)載請注明:?失落的宇宙?2012年05月21日?于?雨松MOMO程序研究院?發(fā)表
轉(zhuǎn)載于:https://www.cnblogs.com/xuejinhui/p/4340313.html
總結(jié)
以上是生活随笔為你收集整理的Cocos2D研究院之CCNode详解(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SD卡启动盘制作软件
- 下一篇: easyui 布局自适应