cocos2dx-lua官方demo構建流程代碼解析

       很久沒弄cocos2dx了,其實相比unity我個人真心比較喜歡cocos,可能是我比較喜歡能直接接觸代碼吧,畢竟沒有什麼比代碼更可靠的。

       我們看看c++調用lua的地方吧,打開cocos的c++工程,打開AppDelegate文件,可以看到engine->executeScriptFile("main.lua")這一句就是對lua的調用,接下來就可以開始看lua層了,從上面這句代碼可以看出,lua層的啓動函數就在main.lua文件裏。打開lua工程的main.lua文件,我們看到lua層首先的啓動函數裏只執行了require("app.MyApp"):create():run()這一句代碼,想要知道這句代碼怎麼工作我們就需要一層層抽絲剝繭了,接下來也就是正題了。

require("app.MyApp")這是lua的加載模塊的方法,來看看app.MyApp這一模塊吧,在app目錄下找到MyApp文件,首先映入眼簾的就是一句local MyApp = class("MyApp", cc.load("mvc").AppBase),其實這一句代碼包含了兩個需要注意的地方,第一個就是class這個函數,我們知道lua是沒有c++那樣的存在類的繼承這樣的特性的,所以這是cocos團隊做的lua仿繼承的方式。找到class函數的函數實現,實現在cocos/cocos2d/functions.lua文件中,打開這個文件,就可以看到class的實現了,另一個要注意的是cc.load這個函數,這個函數的具體實現在cocos/framework/package_support.lua文件中,同樣打開這個文件就可以看到cc.load的具體實現cc.load("mvc").AppBase這一句代碼的意思,只要跟着函數的實現就不難理解,作用就是先加載了packages.mvc.init.lua模塊,從init.lua模塊中獲得AppBase,而AppBase也是利用class的方式構造了一個實例,理解了cc.load接下來就看看class的具體實現。我們從local AppBase = class("AppBase")這一句開始入手吧,畢竟是最先執行的只帶一個參數的class。而且,這個AppBase將會是MyApp的基類(就當做是吧)。進入class函數的實現,因爲class("AppBase")只傳了一個類名進去,所以class函數實現其實在這裏只主要看後半部分就可以了,這裏因爲只傳了一個類名進來,所以執行到了 setmetatable(cls, {__index = cls.super})這一句代碼,這句代碼其實意思就是設置了元表爲空,就相當於沒有基類,而可以看到,假如calss方法還傳了另一個表進來,而且這個表由calss創建並且已經是多次繼承,則會執行else部分代碼,每一次獲取該表元素,不存在則從super中獲取,這就是lua的類似繼承的實現。繼續往下看,看到假如創建的表沒有ctor,將自動創建一個ctor方法,不過該方法什麼都不做。再往下這裏幫每一個創建的對象都創建了一個create方法,這個create方法是cocos2dx2.x以後一直沿用的二段構建的方式,個人覺得挺好用。在create函數裏執行了一些了構建初始化的方法,利用一個new方法。如此就該能理解 local MyApp = class("MyApp", cc.load("mvc").AppBase)這句代碼的完整意思了,就是仿造c++的繼承,創建了一個MyApp對象,該對象繼承了AppBase所有方法以及變量,其中MyApp對象的create方法由class函數幫它構建,run方法則是繼承了AppBase的run方法。這時候我們就可以在回來看看 require("app.MyApp"):create():run()這句代碼。就是創建了一個MyApp對象,並且調用了它繼承自AppBase的run方法。進去run方法可以看到,這裏是運行了defaultSceneName場景,cocos2dx-lua的遊戲構建流程解析就到這裏。

下一篇也不知道什麼時候,佛性寫博哈哈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章