日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cocos2D研究院之CCNode详解(三)

發布時間:2025/3/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cocos2D研究院之CCNode详解(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.xuanyusong.com/archives/950

上一章我們了解了cocos2d的項目路徑以及工作原理,這次作者要真刀真槍地講解代碼了,咱們先來看看cocos2d最常用、也是作者認為最核心的類——CCNode。

之前說過,cocos2d的所有類都以CC開頭,那么實際上這個類的名字就是Node,類如其名,這個類的實例就是一個節點。Cocos2d的類是樹狀繼承的,而在內存中,各個實例之間也是以“樹”這種數據結構相關聯的。,可見樹在cocos2d中的重要性,難怪某位偉人說“要致富,少生孩子多種樹”……(霧)所以如果有童鞋對樹不太了解的話,建議去看看數據結構,相信會對你的編碼有幫助。(在后面的文章中,作者均以讀者了解樹的相關知識為前提來講解)

在實際應用中,除了根節點外,每一個節點都有一個父節點,任何節點都可以存在N個子節點,結構圖如下:

圖中的每個圓圈都是一個節點(即CCNode實例),圓圈中的數字是它們的編號,所有的節點組合到一起形成了一個樹。我們可以看到,1是這個樹的根節點,因為它沒有父節點,其余所有節點都是它直接或間接的子節點,2和3是1的子節點,4和5是2的子節點,6是3的子節點。它們通過彼此間的連線可以找到對方,就是說2知道1是它的父節點,4和5是它的子節點,但并不知道3是它的“兄弟”(沒有連線),只能通過1間接的尋找,因此這種“關聯”效率是最低的,且沒有泛用性,在開發中應盡量避免。

上一章的最后提到過,場景是容納所有演員的大舞臺,只有加入場景的元素才會被顯示到屏幕上,那么如果圖中的樹是一個能夠正確運行的體系,1一定是一個場景,2和3有可能是層,后面就是一系列的“演員”。可能有的童鞋會問:場景和層是什么類,它們不是CCNode,為什么能作為它們的父節點,加入到樹中呢?其實答案我在上一章也說過,cocos2d的類是一層一層繼承下來的,它們擁有共通的接口(都是在CCNode聲明的),場景類是CCScene,層類是CCLayer,它們都是CCNode的子類,就是說它們實際上也是一個node,完全可以放置在樹的任何位置。像這樣的例子在cocos2d中還有很多(比如精靈),所以說CCNode是cocos2d的核心一點也不為過。

了解了CCNode的重要性,接下來我們就一起研究下它的內部結構吧~

首先我們先看看它有哪些屬性:(它繼承自NSObject,因此它與Foundation框架的兼容性完全不用擔心= =)

float rotation_

節點的旋轉角度,如果是圖片的話,會看到旋轉效果,所以基本上是為屏幕輸出服務的。

float scaleX_, scaleY_

節點的縮放比例,X為橫向,Y為縱向,當值為1的時候表示原比例,0.5表示縮小一半,2表示放大1倍,如果是圖片的話就會看到效果,也是為屏幕輸出服務的。

CGPoint position_

節點的坐標,該屬性是一個結構體,position_.x是它的橫坐標,position_.y是縱坐標,基本上也是要顯示到屏幕上才有意義。

float skewX_, skewY_

節點的扭曲角度,類似于Windows畫圖板中的扭曲功能,X是橫向扭曲,Y是縱向扭曲,單位是度數,也是屏顯用的。

CGPoint anchorPointInPoints_

節點的錨點坐標,所謂錨點就是當旋轉、縮放或是用其它方式操作節點時的參考的基準點,例如圖片的錨點在正中心,當放大它的時候,圖片就會向四周擴散,當旋轉一個錨點在左上角的圖片時,圖片就會以左上角為軸旋轉。

CGPoint anchorPoint_

節點的錨點在節點位置的比例,比如說一個節點的坐標為(0, 0),寬高各為100,那么當它的錨點坐標為(50, 50)的時候,anchorPoint_.x = 0.5,anchorPoint_.y = 0.5。

CGSize contentSize_

節點的寬高,它也是一個結構體,contentSize_.width表示寬,contentSize_.height表示高,它和position_配合可以用來檢測碰撞,但需要注意,contentSize_不會因為節點的旋轉和縮放而改變大小。

CCCamera *camera_

節點的鏡頭,cocos2d雖然是2D游戲引擎,但實際上它是通過3D方式繪制2D效果的,因此有鏡頭存在就不奇怪了。CCCamera也是cocos2d的一個類,它默認情況下是正對著節點的,距離也是剛好使節點能夠以1:1的比例顯示到屏幕上,當我們手動修改它的參數后,節點就會呈現出歪曲或縮放等效果。

NSInteger zOrder_

節點的Z軸,當有多個節點在屏幕顯示時,引擎會根據它們Z軸的大小決定繪制順序,Z軸大的會蓋住Z軸小的。

CCArray *children_

重頭戲來了,前面說過節點可以有N個子節點,children_就是存儲這些子節點地址的變量,節點就是通過它們找到自己的子節點的。children_的類型是CCArray,這是cocos2d自己封裝的一個數組類,每個元素存儲一個子節點地址,它引入了tag機制,當節點有多個子節點時,可以根據它們的tag找到自己想要的那一個。

CCNode *parent_

另一個重點——節點的父節點。因為樹中的每個節點都繼承自CCNode,所以用CCNode類型定義父節點是最萬無一失的,節點可以通過它找到自己的父節點,因為父節點最多只有一個,所以不需要用數組保存。

NSInteger tag_

節點的標簽,主要是幫助其父節點找到自己,因為每個節點的子節點并不一定是唯一的,當需要遍歷時可以用該參數做區分,所以兄弟節點的標簽盡量不要一樣。

Bool isRunning_

表示節點是否在更新邏輯,之前說過,未加入樹的節點是不會顯示到屏幕上的,其實它的邏輯運算也是一樣,就是說沒有父節點的節點不會顯示,也不會處理自己的邏輯,它的一切活動都會停止。那么當節點被加入到樹中的時候,isRunning_會被自動置為Yes,此時它會開始執行自己的運算,當節點離開樹時,isRunning_會被置為No,如果想在它在樹中的時候暫停運算,就需要將它的isRunning_手動置為No。

Bool visible_

和isRunning_對應,用來表示節點是否在繪制,當visible_為No時,節點即使在樹中也不會繪制到屏幕上,就相當于隱藏了起來。

以上就是CCNode比較重要的屬性,不過我們在開發中直接操作它們的頻率并不高,而是通過類中聲明的相關方法去改變它們,下面我就來說說CCNode中的方法。

+(id) node

實例化一個CCnode對象,實際上就是封裝了alloc、init和autorelease方法。

-(id) init

初始化,將一些數值型的參數歸0,縮放比例設為1,指針型的參數設為nil。

-(CCArray*) children

返回對象的children_,即獲取全部的子節點。

-(Bool) visible

返回visible_參數,用于檢測該節點當前是否被繪制。

-(void) setVisible: (Bool)visible

設置節點的繪制狀態,Yes為可見,No為不可見

-(CCNode*) parent

返回節點的parent_,即獲取父節點

-(void) setParent: (CCNode*)parent

設置父節點,但實際應用中不要這樣修改,因為極易出bug,正確的修改方法會在后面介紹。

-(NSInteger) tag

返回對象的tag_,即獲取節點的標簽。

-(NSInteger) zOrder

返回對象的zOrder_,即獲取Z軸。

-(Bool) isRunning

返回對象的isRunning_,即檢測該節點當前是否更新邏輯。

-(float) rotation

返回對象的rotation_,即獲取節點的旋轉角度。

-(void) setRotation: (float)rotation

設置對象的rotation_值,即旋轉節點。

-(CGPoint) position

返回對象的position_,即獲取節點的坐標。

-(void) setPosition: (CGPoint)position

設置對象的position_,即更改節點的坐標。

-(CGPoint) anchorPoint

返回對象的anchorPoint_,即獲取節點的錨點。

-(void) setAnchorPoint: (CGPoint)anchorPoint

設置對象的anchorPoint_,即修改節點的描點。

-(CGSize) contentSize

返回對象的contentSize_,即獲取節點的寬高。

-(void) setContentSize: (CGSize)contentSize

設置對象的contentSize_,即改變節點的寬高。

-(float) skewX

返回對象的skewX_,即獲取節點的橫向扭曲角度。

-(void) setSkewX: (float)skewX

設置對象的skewX_,即設置節點的橫向扭曲角度。

-(float) skewY

返回對象的skewY_,即獲取節點的縱向扭曲角度。

-(void) setSkewY: (float)skewY

設置對象的skewY_,即設置節點的縱向扭曲角度。

-(float) scaleX

返回對象的scaleX_,即獲取節點的橫向縮放比例。

-(void) setScaleX: (float)scaleX

設置對象的scaleX_,即橫向縮放節點。

-(float) scaleY

返回對象的scaleY_,即獲取節點的縱向縮放比例。

-(void) setScaleY: (float)scaleY

設置對象的scaleY_,即縱向縮放節點。

-(CGRect) boundingBox

返回對象的碰撞框(由坐標和寬高組合而成),這個參數會隨著節點的縮放或旋轉等操作而改變。

-(CCCamera*) camera

返回對象的camera_,即獲取節點的鏡頭。

-(CCNode*) getChildByTag: (NSInteger) aTag

根據tag_返回children_數組中的某個元素,即根據標簽獲取節點的某個子節點。

-(void) addChild: (CCNode*)child z: (NSInteger)z tag: (NSInteger)aTag

向children_數組中添加一個CCNode對象,即給節點添加一個子節點,z是子節點的Z軸,aTag是子節點的標簽,此方法會將該子節點的parent_指針指向自己,因此這才是設置父節點的正解,比setParent要安全的多。

-(void) addChild: (CCNode*)child z: (NSInteger)z

-(void) addChild: (CCNode*)child

缺省了tag或z的添加子節點方法,缺省值默認為0。

-(void) removeFromParentAndCleanup: (Bool)cleanup

將節點從它的父節點的children_數組中刪除,即脫離樹,cleanup表示是否將其從內存中清除。

-(void) removeChild: (CCNode*)child cleanup: (Bool)cleanup

將某一節點從children_數組中刪除,即刪除某一子節點。

-(void) removeChildByTag: (NSInteger)aTag cleanup: (Bool)cleanup

根據tag_刪除children_數組中的某個元素,即根據標簽刪除節點的某個子節點。

-(void) removeAllChildrenWithCleanup: (Bool)cleanup

清空對象的children_數組,即刪除所有子節點。

-(void) _setZOrder: (NSInteger)z

設置對象的zOrder_,即改變節點的Z軸。

-(void) reorderChild: (CCNode*)child z: (NSInteger)z

將某節點從子節點隊列中取出,并重新重新插入隊列,目的是改變其Z軸。

-(void) visit

繪制函數,用來將節點內容(多為圖片或文字)顯示到屏幕。

-(void) onEnter

相當于一個激活過程,它會在節點被添加到樹中的時候執行,使其可以更新自己的邏輯。

-(void) onExit

取消激活,作用是暫停某節點的邏輯更新。

-(CCAction*)runAction: (CCAction*)action

一個會經常被用到的類,作用是執行一種行為,行為模式由參數action決定,CCAction就是上一章提到的行為類,runAction就是聯系實體類和行為類的橋梁。行為執行完畢后,action會自動釋放(用了autorelease),所以使用時不用擔心內存問題。但需要注意,當isRunning_為No時,節點執行的行為會暫停,就是說onExit有暫停節點一切行為的功能。

-(void) stopAllActions

停止節點正在執行的所有行為,注意這里是停止,不是暫停,函數執行后節點中的所有行為類實例都將從內存中清除。

-(void) stopAction: (CCAction*)action

停止節點的某一個行為,如果沒有執行該行為則什么都不做。

-(void) stopActionByTag: (NSInteger)aTag

根據標簽停止節點的某一個行為。

-(CCAction*) getActionByTag: (NSInteger)aTag

根據標簽獲取某個正在執行的行為。

-(void) schedule: (SEL)selector interval: (ccTime)interval

Schedule是cocos2d中的一個很重要的機制,在作者看來它的實用性僅次于行為類,它的功能和CCAction有相似的地方,都是執行一種行為;不同之處在于,schedule是通過調用方法來執行邏輯的,而且他它內部還有個計時器,可以每隔一定的時間調用一次,反復循環,直到手動將其停止或者節點被刪除(暫停)。這里的參數selector就是執行的方法,interval是間隔時間(秒),ccTime其實就是一個浮點數。

-(void) unschedule: (SEL)selector: (SEL)selector

停止一個schedule任務,注意這里是停止不是暫停。

-(void) unscheduleAllSeletors

停止所有schedule任務

-(void) resumeSchedulerAndActions

恢復運行節點的行為和schedule。

-(void) pauseSchedulerAndActions

暫停節點的行為和schedule。

以上就是實體類的常用參數和方法,希望能對你學習cocos2d有所幫助。有一點要特別提醒一下,當節點執行了一個set開頭的方法(即賦值方法)或某種行為時,產生的效果并不僅限于該節點,也包括它的所有子節點,以開頭的示例圖為例,當節點1執行了setPosition方法后,節點1、2、3、4、5、6都會發生位移,但如果是節點2執行的setPosition,那么只有節點2、4、5會移動,節點1、3、6不會受影響。善用這點的話會使開發更加省力,反之則會給自己增添不少麻煩,所以在設計樹的結構時需要動些腦筋(當然作者認為這樣還是利大于弊的)。

有了CCNode,自然還要學CCAction,那么下一章我就帶大家了解一下這個類,掌握了它們之后,我會寫一些例子,以便加深了解。

  • 本文固定鏈接:?http://www.xuanyusong.com/archives/950
  • 轉載請注明:?失落的宇宙?2012年05月21日?于?雨松MOMO程序研究院?發表

轉載于:https://www.cnblogs.com/xuejinhui/p/4340313.html

總結

以上是生活随笔為你收集整理的Cocos2D研究院之CCNode详解(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。