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

        歡迎訪問(wèn) 生活随笔!

        生活随笔

        當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

        编程问答

        Cocos2D研究院之CCNode详解(三)

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

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

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

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

        在實(shí)際應(yīng)用中,除了根節(jié)點(diǎn)外,每一個(gè)節(jié)點(diǎn)都有一個(gè)父節(jié)點(diǎn),任何節(jié)點(diǎn)都可以存在N個(gè)子節(jié)點(diǎn),結(jié)構(gòu)圖如下:

        圖中的每個(gè)圓圈都是一個(gè)節(jié)點(diǎn)(即CCNode實(shí)例),圓圈中的數(shù)字是它們的編號(hào),所有的節(jié)點(diǎn)組合到一起形成了一個(gè)樹(shù)。我們可以看到,1是這個(gè)樹(shù)的根節(jié)點(diǎn),因?yàn)樗鼪](méi)有父節(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)。它們通過(guò)彼此間的連線可以找到對(duì)方,就是說(shuō)2知道1是它的父節(jié)點(diǎn),4和5是它的子節(jié)點(diǎn),但并不知道3是它的“兄弟”(沒(méi)有連線),只能通過(guò)1間接的尋找,因此這種“關(guān)聯(lián)”效率是最低的,且沒(méi)有泛用性,在開(kāi)發(fā)中應(yīng)盡量避免。

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

        了解了CCNode的重要性,接下來(lái)我們就一起研究下它的內(nèi)部結(jié)構(gòu)吧~

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

        float rotation_

        節(jié)點(diǎn)的旋轉(zhuǎn)角度,如果是圖片的話,會(huì)看到旋轉(zhuǎn)效果,所以基本上是為屏幕輸出服務(wù)的。

        float scaleX_, scaleY_

        節(jié)點(diǎn)的縮放比例,X為橫向,Y為縱向,當(dāng)值為1的時(shí)候表示原比例,0.5表示縮小一半,2表示放大1倍,如果是圖片的話就會(huì)看到效果,也是為屏幕輸出服務(wù)的。

        CGPoint position_

        節(jié)點(diǎn)的坐標(biāo),該屬性是一個(gè)結(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)時(shí)的參考的基準(zhǔn)點(diǎn),例如圖片的錨點(diǎn)在正中心,當(dāng)放大它的時(shí)候,圖片就會(huì)向四周擴(kuò)散,當(dāng)旋轉(zhuǎn)一個(gè)錨點(diǎn)在左上角的圖片時(shí),圖片就會(huì)以左上角為軸旋轉(zhuǎn)。

        CGPoint anchorPoint_

        節(jié)點(diǎn)的錨點(diǎn)在節(jié)點(diǎn)位置的比例,比如說(shuō)一個(gè)節(jié)點(diǎn)的坐標(biāo)為(0, 0),寬高各為100,那么當(dāng)它的錨點(diǎn)坐標(biāo)為(50, 50)的時(shí)候,anchorPoint_.x = 0.5,anchorPoint_.y = 0.5。

        CGSize contentSize_

        節(jié)點(diǎn)的寬高,它也是一個(gè)結(jié)構(gòu)體,contentSize_.width表示寬,contentSize_.height表示高,它和position_配合可以用來(lái)檢測(cè)碰撞,但需要注意,contentSize_不會(huì)因?yàn)楣?jié)點(diǎn)的旋轉(zhuǎn)和縮放而改變大小。

        CCCamera *camera_

        節(jié)點(diǎn)的鏡頭,cocos2d雖然是2D游戲引擎,但實(shí)際上它是通過(guò)3D方式繪制2D效果的,因此有鏡頭存在就不奇怪了。CCCamera也是cocos2d的一個(gè)類,它默認(rèn)情況下是正對(duì)著節(jié)點(diǎn)的,距離也是剛好使節(jié)點(diǎn)能夠以1:1的比例顯示到屏幕上,當(dāng)我們手動(dòng)修改它的參數(shù)后,節(jié)點(diǎn)就會(huì)呈現(xiàn)出歪曲或縮放等效果。

        NSInteger zOrder_

        節(jié)點(diǎn)的Z軸,當(dāng)有多個(gè)節(jié)點(diǎn)在屏幕顯示時(shí),引擎會(huì)根據(jù)它們Z軸的大小決定繪制順序,Z軸大的會(huì)蓋住Z軸小的。

        CCArray *children_

        重頭戲來(lái)了,前面說(shuō)過(guò)節(jié)點(diǎn)可以有N個(gè)子節(jié)點(diǎn),children_就是存儲(chǔ)這些子節(jié)點(diǎn)地址的變量,節(jié)點(diǎn)就是通過(guò)它們找到自己的子節(jié)點(diǎn)的。children_的類型是CCArray,這是cocos2d自己封裝的一個(gè)數(shù)組類,每個(gè)元素存儲(chǔ)一個(gè)子節(jié)點(diǎn)地址,它引入了tag機(jī)制,當(dāng)節(jié)點(diǎn)有多個(gè)子節(jié)點(diǎn)時(shí),可以根據(jù)它們的tag找到自己想要的那一個(gè)。

        CCNode *parent_

        另一個(gè)重點(diǎn)——節(jié)點(diǎn)的父節(jié)點(diǎn)。因?yàn)闃?shù)中的每個(gè)節(jié)點(diǎn)都繼承自CCNode,所以用CCNode類型定義父節(jié)點(diǎn)是最萬(wàn)無(wú)一失的,節(jié)點(diǎn)可以通過(guò)它找到自己的父節(jié)點(diǎn),因?yàn)楦腹?jié)點(diǎn)最多只有一個(gè),所以不需要用數(shù)組保存。

        NSInteger tag_

        節(jié)點(diǎn)的標(biāo)簽,主要是幫助其父節(jié)點(diǎn)找到自己,因?yàn)槊總€(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)并不一定是唯一的,當(dāng)需要遍歷時(shí)可以用該參數(shù)做區(qū)分,所以兄弟節(jié)點(diǎn)的標(biāo)簽盡量不要一樣。

        Bool isRunning_

        表示節(jié)點(diǎn)是否在更新邏輯,之前說(shuō)過(guò),未加入樹(shù)的節(jié)點(diǎn)是不會(huì)顯示到屏幕上的,其實(shí)它的邏輯運(yùn)算也是一樣,就是說(shuō)沒(méi)有父節(jié)點(diǎn)的節(jié)點(diǎn)不會(huì)顯示,也不會(huì)處理自己的邏輯,它的一切活動(dòng)都會(huì)停止。那么當(dāng)節(jié)點(diǎn)被加入到樹(shù)中的時(shí)候,isRunning_會(huì)被自動(dòng)置為Yes,此時(shí)它會(huì)開(kāi)始執(zhí)行自己的運(yùn)算,當(dāng)節(jié)點(diǎn)離開(kāi)樹(shù)時(shí),isRunning_會(huì)被置為No,如果想在它在樹(shù)中的時(shí)候暫停運(yùn)算,就需要將它的isRunning_手動(dòng)置為No。

        Bool visible_

        和isRunning_對(duì)應(yīng),用來(lái)表示節(jié)點(diǎn)是否在繪制,當(dāng)visible_為No時(shí),節(jié)點(diǎn)即使在樹(shù)中也不會(huì)繪制到屏幕上,就相當(dāng)于隱藏了起來(lái)。

        以上就是CCNode比較重要的屬性,不過(guò)我們?cè)陂_(kāi)發(fā)中直接操作它們的頻率并不高,而是通過(guò)類中聲明的相關(guān)方法去改變它們,下面我就來(lái)說(shuō)說(shuō)CCNode中的方法。

        +(id) node

        實(shí)例化一個(gè)CCnode對(duì)象,實(shí)際上就是封裝了alloc、init和autorelease方法。

        -(id) init

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

        -(CCArray*) children

        返回對(duì)象的children_,即獲取全部的子節(jié)點(diǎn)。

        -(Bool) visible

        返回visible_參數(shù),用于檢測(cè)該節(jié)點(diǎn)當(dāng)前是否被繪制。

        -(void) setVisible: (Bool)visible

        設(shè)置節(jié)點(diǎn)的繪制狀態(tài),Yes為可見(jiàn),No為不可見(jiàn)

        -(CCNode*) parent

        返回節(jié)點(diǎn)的parent_,即獲取父節(jié)點(diǎn)

        -(void) setParent: (CCNode*)parent

        設(shè)置父節(jié)點(diǎn),但實(shí)際應(yīng)用中不要這樣修改,因?yàn)闃O易出bug,正確的修改方法會(huì)在后面介紹。

        -(NSInteger) tag

        返回對(duì)象的tag_,即獲取節(jié)點(diǎn)的標(biāo)簽。

        -(NSInteger) zOrder

        返回對(duì)象的zOrder_,即獲取Z軸。

        -(Bool) isRunning

        返回對(duì)象的isRunning_,即檢測(cè)該節(jié)點(diǎn)當(dāng)前是否更新邏輯。

        -(float) rotation

        返回對(duì)象的rotation_,即獲取節(jié)點(diǎn)的旋轉(zhuǎn)角度。

        -(void) setRotation: (float)rotation

        設(shè)置對(duì)象的rotation_值,即旋轉(zhuǎn)節(jié)點(diǎn)。

        -(CGPoint) position

        返回對(duì)象的position_,即獲取節(jié)點(diǎn)的坐標(biāo)。

        -(void) setPosition: (CGPoint)position

        設(shè)置對(duì)象的position_,即更改節(jié)點(diǎn)的坐標(biāo)。

        -(CGPoint) anchorPoint

        返回對(duì)象的anchorPoint_,即獲取節(jié)點(diǎn)的錨點(diǎn)。

        -(void) setAnchorPoint: (CGPoint)anchorPoint

        設(shè)置對(duì)象的anchorPoint_,即修改節(jié)點(diǎn)的描點(diǎn)。

        -(CGSize) contentSize

        返回對(duì)象的contentSize_,即獲取節(jié)點(diǎn)的寬高。

        -(void) setContentSize: (CGSize)contentSize

        設(shè)置對(duì)象的contentSize_,即改變節(jié)點(diǎn)的寬高。

        -(float) skewX

        返回對(duì)象的skewX_,即獲取節(jié)點(diǎn)的橫向扭曲角度。

        -(void) setSkewX: (float)skewX

        設(shè)置對(duì)象的skewX_,即設(shè)置節(jié)點(diǎn)的橫向扭曲角度。

        -(float) skewY

        返回對(duì)象的skewY_,即獲取節(jié)點(diǎn)的縱向扭曲角度。

        -(void) setSkewY: (float)skewY

        設(shè)置對(duì)象的skewY_,即設(shè)置節(jié)點(diǎn)的縱向扭曲角度。

        -(float) scaleX

        返回對(duì)象的scaleX_,即獲取節(jié)點(diǎn)的橫向縮放比例。

        -(void) setScaleX: (float)scaleX

        設(shè)置對(duì)象的scaleX_,即橫向縮放節(jié)點(diǎn)。

        -(float) scaleY

        返回對(duì)象的scaleY_,即獲取節(jié)點(diǎn)的縱向縮放比例。

        -(void) setScaleY: (float)scaleY

        設(shè)置對(duì)象的scaleY_,即縱向縮放節(jié)點(diǎn)。

        -(CGRect) boundingBox

        返回對(duì)象的碰撞框(由坐標(biāo)和寬高組合而成),這個(gè)參數(shù)會(huì)隨著節(jié)點(diǎn)的縮放或旋轉(zhuǎn)等操作而改變。

        -(CCCamera*) camera

        返回對(duì)象的camera_,即獲取節(jié)點(diǎn)的鏡頭。

        -(CCNode*) getChildByTag: (NSInteger) aTag

        根據(jù)tag_返回children_數(shù)組中的某個(gè)元素,即根據(jù)標(biāo)簽獲取節(jié)點(diǎn)的某個(gè)子節(jié)點(diǎn)。

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

        向children_數(shù)組中添加一個(gè)CCNode對(duì)象,即給節(jié)點(diǎn)添加一個(gè)子節(jié)點(diǎn),z是子節(jié)點(diǎn)的Z軸,aTag是子節(jié)點(diǎn)的標(biāo)簽,此方法會(huì)將該子節(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ù)組中刪除,即脫離樹(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ù)組中的某個(gè)元素,即根據(jù)標(biāo)簽刪除節(jié)點(diǎn)的某個(gè)子節(jié)點(diǎn)。

        -(void) removeAllChildrenWithCleanup: (Bool)cleanup

        清空對(duì)象的children_數(shù)組,即刪除所有子節(jié)點(diǎn)。

        -(void) _setZOrder: (NSInteger)z

        設(shè)置對(duì)象的zOrder_,即改變節(jié)點(diǎn)的Z軸。

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

        將某節(jié)點(diǎn)從子節(jié)點(diǎn)隊(duì)列中取出,并重新重新插入隊(duì)列,目的是改變其Z軸。

        -(void) visit

        繪制函數(shù),用來(lái)將節(jié)點(diǎn)內(nèi)容(多為圖片或文字)顯示到屏幕。

        -(void) onEnter

        相當(dāng)于一個(gè)激活過(guò)程,它會(huì)在節(jié)點(diǎn)被添加到樹(shù)中的時(shí)候執(zhí)行,使其可以更新自己的邏輯。

        -(void) onExit

        取消激活,作用是暫停某節(jié)點(diǎn)的邏輯更新。

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

        一個(gè)會(huì)經(jīng)常被用到的類,作用是執(zhí)行一種行為,行為模式由參數(shù)action決定,CCAction就是上一章提到的行為類,runAction就是聯(lián)系實(shí)體類和行為類的橋梁。行為執(zhí)行完畢后,action會(huì)自動(dòng)釋放(用了autorelease),所以使用時(shí)不用擔(dān)心內(nèi)存問(wèn)題。但需要注意,當(dāng)isRunning_為No時(shí),節(jié)點(diǎn)執(zhí)行的行為會(huì)暫停,就是說(shuō)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)的某一個(gè)行為,如果沒(méi)有執(zhí)行該行為則什么都不做。

        -(void) stopActionByTag: (NSInteger)aTag

        根據(jù)標(biāo)簽停止節(jié)點(diǎn)的某一個(gè)行為。

        -(CCAction*) getActionByTag: (NSInteger)aTag

        根據(jù)標(biāo)簽獲取某個(gè)正在執(zhí)行的行為。

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

        Schedule是cocos2d中的一個(gè)很重要的機(jī)制,在作者看來(lái)它的實(shí)用性僅次于行為類,它的功能和CCAction有相似的地方,都是執(zhí)行一種行為;不同之處在于,schedule是通過(guò)調(diào)用方法來(lái)執(zhí)行邏輯的,而且他它內(nèi)部還有個(gè)計(jì)時(shí)器,可以每隔一定的時(shí)間調(diào)用一次,反復(fù)循環(huán),直到手動(dòng)將其停止或者節(jié)點(diǎn)被刪除(暫停)。這里的參數(shù)selector就是執(zhí)行的方法,interval是間隔時(shí)間(秒),ccTime其實(shí)就是一個(gè)浮點(diǎn)數(shù)。

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

        停止一個(gè)schedule任務(wù),注意這里是停止不是暫停。

        -(void) unscheduleAllSeletors

        停止所有schedule任務(wù)

        -(void) resumeSchedulerAndActions

        恢復(fù)運(yùn)行節(jié)點(diǎn)的行為和schedule。

        -(void) pauseSchedulerAndActions

        暫停節(jié)點(diǎn)的行為和schedule。

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

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

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

        轉(zhuǎn)載于:https://www.cnblogs.com/xuejinhui/p/4340313.html

        總結(jié)

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

        如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。