Cocos2d-x Lua Node與Node層級架構

Cocos2d-x Lua採用層級(樹形)結構管理場景、層、精靈、菜單、文本、地圖和粒子系統等節點(Node)對象。一個場景包含了多個層,一個層又包含多個精靈、菜單、文本、地圖和粒子系統等對象。層級結構中的節點能夠是場景、層、精靈、菜單、文本、地圖和粒子系統等任何對象。
節點的層級結構以下圖所示。

節點的層級結構html

這些節點有一個共同的父類Node,Node類圖以下圖所示。Node類是Cocos2d-x Lua最爲重要的根類,它是場景、層、精靈、菜單、文本、地圖和粒子系統等類的根類。


Node類圖node

Node中重要的操做
Node做爲根類它有不少重要的函數下面咱們分別介紹一下:
建立節點。local childNode = cc.Node:create()。
增長新的子節點。node:->addChild (childNode, 0, 123) ,第二個參數Z軸繪製順序,第三個參數是標籤。
查找子節點。local node = node:getChildByTag(123),經過標籤查找子節點。
node:removeChildByTag(123, true) 經過標籤刪除子節點,並中止全部該節點上的一切動做。
node:removeChild(childNode, true) 刪除childNode節點。並中止全部該子節點上的一切動做。
node:removeAllChildrenWithCleanup(true) 刪除node節點的全部子節點,並中止這些子節點上的一切動做。
node:removeFromParentAndCleanup(true)從父節點刪除node節點,並中止全部該節點上的一切動做。


Node中重要的屬性
此外,Node還有兩個很是重要的屬性:position和anchorPoint。
position(位置)屬性是Node對象的實際位置。position屬性每每還要配合使用anchorPoint屬性,爲了將一個Node對象(標準矩形圖形)精準的放置在屏幕某一個位置上,須要設置該矩形的錨點,anchorPoint是相對於position的比例,默認是(0.5,0.5)。咱們看看下面的幾種狀況:
以下圖所示是anchorPoint爲(0.5,0.5)狀況,這是默認狀況。

anchorPoint爲(0.5,0.5)微信

下圖所示是anchorPoint爲(0.0,0.0)狀況。



anchorPoint爲(0.0,0.0)函數

以下圖所示是anchorPoint爲(1.0,1.0)狀況。



anchorPoint爲(1.0,1.0)字體

以下圖所示是anchorPoint爲(0.66, 0.5)狀況。

anchorPoint爲(0.66, 0.5)網站

爲了進一步瞭解anchorPoint使用,咱們修改HelloLua實例,修改GameScene.lua的GameScene:createLayer()函數以下,其中加粗字體顯示的是咱們添加的代碼。
function GameScene:createLayer()
    cclog("GameScene init")
    local layer = cc.Layer:create()


    local label = cc.LabelTTF:create("Hello World", "Arial", 46)    
    label:setPosition(cc.p(size.width/2,
                          size.height - label:getContentSize().height))
    label:setAnchorPoint(cc.p(1.0, 1.0))
    layer:addChild(label)
    
    local bg = cc.Sprite:create("HelloWorld.png")
    bg:setPosition(cc.p(size.width/2, size.height/2))
    layer:addChild(bg)


    return layer
end
運行結果以下圖所示,Hello World標籤設置了anchorPoint爲(1.0,1.0)。

Hello World標籤的anchorPoint爲(1.0,1.0)ui



遊戲循環與調度
每個遊戲程序都有一個循環在不斷運行,它是由導演對象來管理很維護。若是須要場景中的精靈運動起來,咱們能夠在遊戲循環中使用定時器(Scheduler)對精靈等對象的運行進行調度。由於Node類封裝了Scheduler類,因此咱們也能夠直接使用Node中定時器相關函數。
Node中定時器相關函數主要有:
scheduleUpdateWithPriorityLua(nHandler, priority)。每一個Node對象只要調用該函數,那麼這個Node對象就會定時地每幀回調用一次nHandler函數。priority是優先級,priority值越小越先執行。
unscheduleUpdate ()。中止scheduleUpdateWithPriorityLua的調度。
爲了進一步瞭解遊戲循環與調度的使用,咱們修改HelloLua實例。修改GameScene.lua文件,代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片lua

  1. <span style="font-size:14px;font-weight: normal;">require "Cocos2d"  spa

  2. require "Cocos2dConstants"  .net

  3. size = cc.Director:getInstance():getWinSize()  

  4. local label                                                             ①  

  5. local GameScene = class("GameScene",function()  

  6.     return cc.Scene:create()  

  7. end)  

  8. function GameScene.create()  

  9.     local scene = GameScene.new()  

  10.     scene:addChild(scene:createLayer())  

  11.     return scene  

  12. end  

  13. function GameScene:ctor()  

  14. end  

  15. -- create layer  

  16. function GameScene:createLayer()  

  17.     cclog("GameScene init")  

  18.     local layer = cc.Layer:create()  

  19.     label = cc.LabelTTF:create("Hello World", "Arial", 46)  

  20.     label:setPosition(cc.p(size.width/2,  

  21.         size.height - label:getContentSize().height))  

  22.     label:setTag(123)  

  23.     label:setAnchorPoint(cc.p(1.0, 1.0))  

  24.     layer:addChild(label)  

  25.     local bg = cc.Sprite:create("HelloWorld.png")  

  26.     bg:setPosition(cc.p(size.width/2, size.height/2))  

  27.     layer:addChild(bg)  

  28.     local function update(delta)                                            ②  

  29.         local x,y = label:getPosition()  

  30.         label:setPosition(cc.p(x + 2, y - 2))  

  31.     end  

  32.     --開始遊戲調度  

  33.     layer:scheduleUpdateWithPriorityLua(update, 0)                              ③  

  34.     function onNodeEvent(tag)                                           ④  

  35.         if tag == "exit" then                                               ⑤  

  36.             --開始遊戲調度  

  37.             layer:unscheduleUpdate()                                        ⑥  

  38.         end  

  39.     end  

  40.     layer:registerScriptHandler(onNodeEvent)                                    ⑦  

  41.     return layer  

  42. end  

  43. return GameScene</span>  

上述代碼第①行定義了模塊級標籤對象label。代碼第②行定義的update(delta)函數是調度函數。第③行代碼layer:scheduleUpdateWithPriorityLua(update, 0)是開啓遊戲調度,按照幀率進行調度,優先級0是默認值。
第④行代碼是層處理事件回調函數,其中第⑤行代碼是判斷是否爲退出層事件,若是是退出層事件則調用第⑥行代碼中止調度。第⑦行代碼layer:registerScriptHandler(onNodeEvent)是註冊層事件監聽器。

更多內容請關注最新Cocos圖書《Cocos2d-x實戰:JS卷——Cocos2d-JS開發

本書交流討論網站:http://www.cocoagame.net

歡迎加入Cocos2d-x技術討論羣:257760386

更多精彩視頻課程請關注智捷課堂Cocos課程:http://v.51work6.com

智捷課堂現推出Cocos會員,敬請關注:http://v.51work6.com/courseInfoRedirect.do?action=netDetialInfo&courseId=844465&amp;categoryId=0

《Cocos2d-x實戰 JS卷》現已上線,各大商店均已開售:

京東:http://item.jd.com/11659698.html

歡迎關注智捷iOS課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息

相關文章
相關標籤/搜索