Quick-Cocos2d-x初學者遊戲教程3

本章我們繼續解析新建項目的代碼文件,銜接不上的童鞋可以先回顧下上章的內容。那麼下面我們就言簡意賅直接進入正題吧!

2、main.lua

在src目錄下,除了 config.lua 文件外,還有一個 main.lua 文件,這個 main.lua 是 Quick 項目的通用入口文件,它類似於 Cocos2d-x 中的 AppDelegate.h/cpp 文件,同時也類似於一般 Windows 工程中的 main 文件。

打開 main.lua 文件,其內容如下所示:

function __G__TRACKBACK__(errorMessage)

    print("----------------------------------------")

    print("LUA ERROR: " .. tostring(errorMessage) .. "\n")

    print(debug.traceback("", 2))

    print("----------------------------------------")

end



package.path = package.path .. ";src/"

cc.FileUtils:getInstance():setPopupNotify(false)

require("app.MyApp").new():run()

每個新項目的 main.lua 文件內容都是一樣的,一般情況下,我們不需要改動它。
我們只需要知道,main 文件的最後一行代碼中通過載入的 app.MyApp 模塊創建了一個 MyApp 實例,並且還調用執行了該 MyApp 實例的 run 方法。這行代碼將啓動並執行 MyApp 腳本。從此處我們也可以看出,main.lua 文件是應用程序 lua 腳本的啓動文件。

require 方法表示引入一個文件,使用 require 方法加載文件的過程會檢查文件的 lua 語法,同時會完成被加載文件內部變量的初始化。

3、MyApp.lua

main.lua 文件啓動執行 MyApp 腳本後,接下來我們就來看看“src/app”目錄下的 MyApp.lua 文件,該文件將啓動遊戲場景,其代碼段如下所示:

-- 1

require("config")

require("cocos.init")

require("framework.init")



-- 2

local MyApp = class("MyApp", cc.mvc.AppBase)



-- 3

function MyApp:ctor() 

    MyApp.super.ctor(self) 

end



-- 4

function MyApp:run()

    cc.FileUtils:getInstance():addSearchPath("res/") 

    cc.Director:getInstance():setContentScaleFactor( 640/CONFIG_SCREEN_HEIGHT )

    self:enterScene("MainScene")

end



return MyApp

我們依次來看以上各代碼行的含義:

  1. 使用 require 方法載入配置、cocos 以及 Quick 框架。這些是每個 Quick 程序都必須要加載的。
  2. 使用 class 函數定義一個 MyApp 類。
    class 方法本身是 Quick 框架中定義的一個用於創建自定義 lua 類的函數,該函數可在 Quick 引擎的 “quick/framework/functions.lua” 文件中找到。當然,如果你聽了我的話,在 Sublime 下安裝了 QuickDev 插件,那麼你也可以在 class 字符上單擊右鍵,跳轉到它的定義(Goto Definition),這樣也能找到它。
    gotodefinition
    在 “functions.lua” 中,function class(classname, super)函數有兩個參數,其中 classname 表示的是類名,super表示的是父類或者創建對象實例的函數。當 super 傳入的參數是前者時,將會以傳入的對象爲父類派生新類,如本處;當傳入的參數爲後者時,會以傳入的函數作爲構造函數創建新類,如稍後要講解的 MainScene 類。
    從本段代碼中我們可以看到,MyApp 這個類是從 cc.mvc.AppBase 中繼承而來的,而 AppBase 是 Quick 中自帶的一個 MVC(面向對象的一種設計模式)的應用程序基礎類,這個類爲我們的應用程序提供了一些邏輯控制上的功能,比如進入場景,切換場景等等。
  3. MyApp 的ctor()函數相當於 C++ 中的構造(constructor)函數,以及init()函數。所以我們一般會在ctor()函數中初始化我們的遊戲數據和信息,每當調用 XXClass.new() 創建對象實例時,也會自動執行ctor()函數。
    另外,在子類的ctor函數中必須手動調用父類的構造函數,這樣纔等保證子類能“繼承”父類的屬性和方法,正如上段代碼所示。其中 XXClass.super 可以訪問指定 XXClass 類的父類。
  4. 在 MyApp 的 run 方法中,這裏做了三件事:
    • 首先,通過 addSearchPath 方法設置資源搜索路徑。這也是爲什麼資源一定要放在“res”目錄下的原因。
    • 然後,通過 setContentScaleFactor 方法設置資源縮放因子,這行代碼是我們在上章進行分辨率適配時自己添加的。
    • 最後,因爲 MyApp 類繼承於 AppBase 類,因此自然地,MyApp 也同父類一樣,具備了些許邏輯控制的功能。所以在 run 方法的最後,程序調用 enterScene 函數進入到名爲 “MainScene” 的遊戲場景。
      當然我們也可以在 enterScene 函數中設置場景切換的動畫,不過爲了加深大家對場景切換的印象,我們還是留到後面使用的時候再做詳細的講解。 > 注意:遊戲場景默認必須放在 “src/app/scenes” 目錄下,放到其他目錄下是不能找到的。

4、MainScene.lua

講的這裏,大家應該很清楚 main 文件執行 require("app.MyApp").new():run() 代碼的過程了吧。所以,接下來請大家打開“src/app/scenes”目錄下的 MainScene.lua 文件,我們接着來看它的結構。其代碼如下圖所示:

local MainScene = class("MainScene", function()

    return display.newScene("MainScene") 

end)



function MainScene:ctor()

    cc.ui.UILabel.new({

            UILabelType = 2, text = "Hello, World", size = 64})

        :align(display.CENTER, display.cx, display.cy)

        :addTo(self)

end



function MainScene:onEnter()

end



function MainScene:onExit()

end



return MainScene

在 MainScene.lua 這個文件中,第一行代碼使用 class 函數創建了一個 MainScene 場景類,同前邊創建 MyApp 類不同的是,這裏我們的類不是從基礎類繼承而來,而是通過一個函數創建出來的。

這是因爲 Scene 場景對象必須是一個 C++ 的對象,而 C++ 的對象是無法直接派生出 Lua 的類的,所以我們只有用一個函數把它創建出來,然後再爲它添加相應的方法。

在創建場景的函數段裏,display.newScene() 方法將創建了一個新場景,並返回該 Scene 場景對象。

這裏的 display 是一個重要的概念,在 Quick 中,display 模塊封裝了絕大部分與顯示有關的功能,並負責根據 config.lua 中定義的分辨率設定計算屏幕的設計分辨率。display 模塊提供了衆多的方法和屬性,比如創建層(display.newLayer),創建精靈(display.newSprite),以及恢復暫停切換場景等等。

總而言之,display 是個很值得我們細細探索的模塊。關於它更多詳情內容可參見Quick-Cocos2d-x的API文檔

下面我們例舉一些 display 常用的屬性:

  • display.widthInPixels, display.heightInPixels: 屏幕分辨率的寬、高
  • display.width, display.height: 設計分辨率的寬、高
  • display.cx, display.cy: 設計分辨率中央的 x、y 座標
  • display.left, display.top, display.right, display.bottom: 設計分辨率四邊的座標
  • display.c_left, display.c_top, display.c_right, display.c_bottom: 當父對象在屏幕中央時,屏幕四邊的座標
  • display.contentScaleFactor: 設計分辨率到屏幕分辨率的縮放因子,不同於內容縮放因子。

結合 display 模塊提供的常量,我們可以很方便的獲取屏幕的某些與現實相關的屬性,如位置和顏色等等。display 模塊中關於位置的常量是初始化的時候程序就已經計算好的(不信你可以查看控制檯窗口中的打印信息),它們根據分辨率的不同而不同。
displayValue

MainScene 的 ctor 函數中默認添加了一個 UI 標籤,這個標籤的作用是在屏幕正中間添加一個“Hello World”的文本,並顯示到屏幕上。

其中 cc.ui 模塊中封裝了大量符合腳本風格的 Cocos2d-x 控件,包含 UILabel、UIImage、UISlider 等等。所以正如上述代碼一樣,我們可以通過調用cc.ui.UILabel.new()來實例化一個新的 UILabel 控件。其先有參數分別表示:

  • UILabelType:創建文本對象所使用的方式。
    1 表示使用位圖字體創建文本顯示對象,返回對象是 LabelBMFont。
    2 表示使用 TTF 字體創建文字顯示對象,返回對象是 Label。
  • text:要顯示的文本。
  • size:文字尺寸。

創建好 UILabel 後,通過調用 align 方法設置文本的錨點和顯示位置。最後用 addTo 方法把文本添加到場景中。

至於 MainScene 的 onEnter 和 onExit 兩個方法,清楚 Cocos2d-x 原理的的童鞋應該很容易理解。其中onEnter 方法是在進入場景的時候調用的,我們可以在這裏做一些初始化的工作;而 onExit 方法是在退出場景的時候調用的,在這裏我們可以釋放資源,重置變量。

小結

到現在爲止,我們就已經解析完 src 目錄下所有的 lua 文件了,總的來說,這兩章所解析的 lua 文件的關係和用途如下圖所示:
lc1

好了,上圖把這兩章講解的廢話都概括完了,我想應該夠清楚明瞭的吧!! O(∩_∩)O~,從下章開始,我們將正式開始類el遊戲的開發。

轉載請註明出自:http://shannn.com/archives/387

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