quick框架之MyApp詳解

本來是計劃從這篇開始做個用一個小遊戲教程來講解quick的使用,但是發現羣裏很多童鞋對quick的框架還真是不瞭解
其實這種不瞭解源自於沒有認真的閱讀quick的framework的代碼,但無論是懶得讀還是讀不懂,結果都是會問各種基礎的小白問題,於是我決定這個系列還繼續講解一些小白類的問題,而一些略微深入的使用以及我在做項目中得一些值得分享的東西我會單獨開貼來寫!
好了,進入今天正題,在上一篇內容中,我已經說明了quick得項目啓動過程中,看過的應該知道quick啓動中一個關鍵的類就是MyApp,所以本篇就來詳細講解下這個東西
首先,打開自己新建項目的MyApp.lua文件,代碼我就不貼了,下面開始逐步講解!
1.通過一些文件進行framework的初始化
在MyApp.lua的最開始是3行require語句
require("config")
require("cocos.init")
require("framework.init")
在lua中,require表示引入一個文件,那麼上面的三個文件分別在哪裏呢?
他們分別在:
root/src/config.lua
root/src/cocos/init.lua
root/src/framework/init.lua
其中root表示你項目的根目錄
通過require這三個文件後,將會對quick的框架做一些初始化的事情。簡單說下是如何初始化的,比如,require("config"),這句會加載root/src/config.lua文件,require加載文件的過程中會檢查該文件的lua語法,以及完成文件內的一些變量的初始化,你打開config.lua文件,你回看到都是一些變量的初始化,這些都是全局變量,因爲沒有local,看過lua語法的都曉得。require了之後,你就可以在任何地方引用這些變量,比如DEBUG變量。關於lua的require更詳細明確的講解,請自行百度。這裏,你就可以先理解爲引入三個文件並且進行初始化
2.MyApp的定義
回到MyApp文件,看這一行
local MyApp = class("MyApp", cc.mvc.AppBase)
這一行的意思是:定義一個MyApp類,它繼承自cc.mvc.AppBase
那麼問題來了,cc.mvc.AppBase在哪裏?
在root/framework/cc/mvc/AppBase.lua
理解繼承概念的童鞋一看則明,不瞭解何爲繼承的,可以簡單的這樣理解:MyApp繼承了AppBase,那麼MyApp就可以使用AppBase的所有變量和函數,就跟MyApp自己的一樣,如何使用,下面會具體介紹
3.MyApp的構造函數
MyApp:ctor這個函數理解爲構造函數
MyApp.super.ctor(self),這一行的意思是調用基類的構造函數,也就是AppBase的構造函數
那麼我們來看看AppBase的ctor函數都幹了啥,打開AppBase,看ctor函數
cc(self):addComponent("components.behavior.EventProtocol"):exportMethods()
這一行是給AppBase函數添加事件組件,至於事件組件是啥,後面會有專門對這個組件講解,這裏你知道是添加了事件組件就好
self.name = appName
self.packageRoot = packageRoot or "app"

這裏就是簡單地兩個賦值,self就是AppBase自己
local eventDispatcher = cc.Director:getInstance():getEventDispatcher()
local customListenerBg = cc.EventListenerCustom:create(AppBase.APP_ENTER_BACKGROUND_EVENT,
                                handler(self, self.onEnterBackground))
eventDispatcher:addEventListenerWithFixedPriority(customListenerBg, 1)
local customListenerFg = cc.EventListenerCustom:create(AppBase.APP_ENTER_FOREGROUND_EVENT,
                                handler(self, self.onEnterForeground))
eventDispatcher:addEventListenerWithFixedPriority(customListenerFg, 1)

這幾行內容是通過eventDispatcher註冊兩個監聽事件,分別是AppBase.APP_ENTER_BACKGROUND_EVENT和AppBase.APP_ENTER_FOREGROUND_EVENT,這兩個事件是你的遊戲在切換到後臺和從後臺切換回來的時候觸發後,會調用AppBase的兩個方法onEnterBackground,onEnterForeground。這兩個方法的定義在AppBase的下面,因爲涉及到事件的東西,暫時用不到,所以不做詳解。
self.snapshots_ = {}
-- set global app
app = self

這兩行是初始化兩個變量,注意app這個變量的初始化,app被定義爲一個全局變量,並且賦值爲self,也就是以後你使用app這個全局變量的時候它就是AppBase,或者繼承自AppBase的MyApp
4.run函數
cc.FileUtils:getInstance():addSearchPath("res/")
這一行是向搜索路徑中添加res目錄,何爲搜索路徑,就是你將來引用資源的時候能夠查找的目錄。
self:enterScene("MainScene")
這一句有童鞋會不理解,enterScene方法哪裏來得,MyApp中沒有定義啊,是得MyApp中沒有定義,因爲是在AppBase中定義的,而上面說了,通過繼承可以直接訪問基類的方法,所以MyApp可以直接使用enterScene方法。
在AppBase中找到enterScene方法的定義。
enterScene(sceneName, args, transitionType, time, more)
此函數接收4個參數,你可能比較奇怪,爲啥前面MyApp裏只傳入了一個參數,看過lua語法的應該知道,lua中函數的參數可以少寫或者多寫,少寫得話,對應位置的參數會賦值nil,多寫的話會被省略,所以self:enterScene("MainScene")等同於self:enterScene("MainScene", nil, nil, nil)
sceneName是你要跳轉的場景名
args是跳轉場景是傳給該場景類構造函數的參數,args需要是一個table
transitionType是場景切換的過渡動畫類型
time過渡時間
more是過渡效果附加參數
在基本的使用中,你只需要傳入sceneName即可
local scenePackageName = self.packageRoot .. ".scenes." .. sceneName
local sceneClass = require(scenePackageName)
local scene = sceneClass.new(unpack(checktable(args)))

這三句的意思是確定該場景所在的包名,引入該場景的文件,生成一個該場景的實例
通過看scenePackageName的賦值你會看出,使用enterScene方法跳轉場景是有限制的,該場景的定義文件一定要在root/scenes/這個文件夾中,比如
root/scenes/MainScene.lua。
隨後,調用display的轉換場景方法來轉換場景
display.replaceScene(scene, transitionType, time, more)
同樣的邏輯你可以看下createView這個方法,這個方法是創建一個定義文件在root/views/這個目錄下的view
5.用args給要切換到的場景傳參
前面說過args傳參需要是一個table類型,比如給MainScene傳參可以這樣寫
self:enterScene("MainScene", {10, 20})
那麼如何在MainScene中接收這兩個參數呢?需要這樣改寫MainScene的ctor定義
MainScene:ctor(arg1, arg2)
此時,arg1 = 10, arg2 = 20
發佈了137 篇原創文章 · 獲贊 36 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章