咱們的編寫的第一個Cocos2d-x Lua程序,命名爲HelloLua,從該工程開始學習其它的內容。
建立工程
咱們建立Cocos2d-x Lua工程能夠經過Cocos2d-x提供的命令工具cocos實現,但這種方式不能與Cocos Code IDE集成開發工具很好地集成,不便於程序編寫和調試。因爲Cocos Code IDE工具是Cocos2d-x開發的專門爲Cocos2d-JS和Cocos2d-x Lua開發設計的,所以使用Cocos Code IDE工具很方便建立Cocos2d-x Lua工程。
首先咱們須要在Cocos Code IDE工具中先配置Lua框架,打開Cocos Code IDE工具,選擇菜單Window→Preferences,彈出對話框如圖所示,選擇Cocos→Lua在右邊的Lua Frameworks中選擇<Cocos2d-x引擎目錄>。
html
配置Lua框架微信
Lua框架配置不須要每次都進行,只是在最開始的配置一下,但建立工程的時候,Cocos Code IDE工具會從這個Lua框架目錄中建立工程文件。
接下來咱們就能夠建立Lua工程了,選擇菜單File→New→Project,以下圖所示,彈出項目類型選擇對話框。
框架
項目類型選擇對話框函數
咱們選中Cocos Lua Project,而後點擊Next按鈕,彈出以下圖所示的對話框。咱們在Project Name項目中輸入工程名稱,Create Project in Workspace是在Workspace目錄中建立工程,咱們須要選中該項目,Create From Existing Resource項目選中可讓咱們從已經存在的工程建立,如今咱們不須要選中該項目。
選擇完成點擊Next按鈕進入到如圖所示配置運行環境對話框,在該對話框中咱們能夠配置項目運行時信息。Orientation項目是配置模擬器的朝向,其中landscape是橫屏顯示,portriat是豎屏顯。Desktop Runtime Settings中的Title是設置模擬器的標題,Desktop Windows initialize Size是設置模擬器的大小。Add Native Codes是設置添加本地代碼到工程,在原本中咱們不須要添加本地代碼。最後點擊Finish按鈕完成建立操做,建立好工程以後,如後圖所示。
工具
新建項目對話框學習
配置運行環境對話框開發工具
建立工程成功界面測試
Cocos Code IDE中運行
建立好工程後咱們能夠測試一下,在左邊的工程導航面板中選中HelloLua工程,右鍵菜單中選擇Run As→Cocos luainding運行咱們剛剛建立的工程,運行結果以下圖所示。
網站
運行工程界面ui
咱們主要編寫的程序代碼是在src目錄下,在本例中Lua 文件負責處理主要的場景界面邏輯。若是咱們想調試程序,能夠設置斷點,以下圖所示,點擊行號以前的位置,設置斷點。
設置斷點
調試運行過程,右鍵菜單中選擇Debug As→Cocos Luabinding菜單。以下圖所示,程序運行到第31行掛起,並進入調試視圖,在調試視圖中咱們能夠查看程序運行的堆棧、變量、斷點、計算表達式和單步執行程序等操做。
運行到斷點掛起
工程文件結構
咱們建立的HelloLua工程已經可以運行起來了,下面咱們介紹一下HelloLua工程中的文件結構,咱們使用Cocos Code IDE打開HelloLua工程,左側的導航面板以下圖所示。
HelloLua工程中的文件結構
在上圖所示導航面板中,res文件夾存放資源文件的,src文件夾是主要的程序代碼main.lua和GameScene.lua,其中main.lua是程序入口文件,Cocos2d-x會在底層綁定該文件,而且啓動和運行它。GameScene.lua中實現了遊戲場景。
代碼解釋
HelloLua工程中主要有兩文件下面咱們詳細解釋一下它們內部的代碼:
一、main.lua文件
main.lua是程序入口文件代碼以下:
r
[html] view plaincopy
equire "Cocos2d" ①
-- cclog
local cclog = function(...) ②
print(string.format(...)) ③
end
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg) ④
cclog("----------------------------------------")
cclog("LUA ERROR: " .. tostring(msg) .. "\n")
cclog(debug.traceback())
cclog("----------------------------------------")
return msg
end
local function main() ⑤
collectgarbage("collect") ⑥
-- avoid memory leak
collectgarbage("setpause", 100) ⑦
collectgarbage("setstepmul", 5000) ⑧
cc.FileUtils:getInstance():addSearchPath("src")
cc.FileUtils:getInstance():addSearchPath("res")
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(480, 320, 0)
--create scene
local scene = require("GameScene") ⑨
local gameScene = scene.create() ⑩
gameScene:playBgMusic()
if cc.Director:getInstance():getRunningScene() then ⑪
cc.Director:getInstance():replaceScene(gameScene)
else
cc.Director:getInstance():runWithScene(gameScene)
end
end
local status, msg = xpcall(main, __G__TRACKBACK__) ⑫
if not status then
error(msg)
end
上述代碼第①行require是在加載Cocos2d模塊,而且能夠避免重複加載。第②行代碼是聲明cclog函數,該函數的做用是輸出日誌信息。第③行代碼print(string.format(...))是輸出函數。
第④行代碼是聲明__G__TRACKBACK__(msg)函數,在程序出錯的時候由第⑫行的xpcall調用,並輸出堆棧信息。下面是日誌輸出的堆棧信息:
[html] view plaincopy
[LUA-print] stack traceback:
[string ".\src/main.lua"]:13: in function '__index'
[string ".\GameScene.lua"]:52: in function <[string ".\GameScene.lua"]:49>
[LUA-print] ----------------------------------------
第⑤行代碼是main()函數,它是由第⑫行的xpcall函數調用。第⑥行代碼collectgarbage("collect")中的collectgarbage是垃圾收集器的通用接口函數,用於操做垃圾收集器,其它的定義以下:
collectgrabage(opt [, arg])
其中的 opt參數是操做方法標誌,標誌包括以下:
collect : 執行一次全垃圾收集週期,見代碼第⑥行。
stop : 中止垃圾收集器。
restart : 重啓垃圾收集器。
count : 返回當前Lua中使用的內存數量,單位KB。
step : 單步執行一個垃圾收集,步長中的size屬性是由參數arg指定,若是完成一次收集週期,將返回true。
setpause: 設置arg/100的值做爲垃圾收集暫停時長,見代碼第⑦行。
setstepmul: 設置arg/100的值,做爲步長的增幅,即「新步長」 = 「舊步長」 * (arg/100),見代碼第⑧行。
上述代碼第⑨行local scene = require("GameScene") 加載GameScene模塊,返回值是table類型全局變量。第⑩行代碼local gameScene = scene.create()從經過靜態create()函數建立GameScene場景。
代碼第⑪行cc.Director:getInstance():getRunningScene()是判斷是否有一個場景正在運行,若是有場景運行則經過cc.Director:getInstance():replaceScene(gameScene)語句使用gameScene場景替換當前場景,不然經過cc.Director:getInstance():runWithScene(gameScene)語句運行gameScene場景,不管是replaceScene仍是runWithScene函數遊戲都會是進入到gameScene場景。
代碼第⑫行local status, msg = xpcall(main, __G__TRACKBACK__)中的xpcall函數是Lua提供,用於調用其它函數,而且能夠捕獲到錯誤,xpcall函數的定義以下:
xpcall (f, err)
其中f參數是要調用的函數,err是捕獲道錯誤時候調用的函數。返回值status是錯誤狀態和msg是錯誤消息。
事實上第⑫行代碼local status, msg = xpcall(main, __G__TRACKBACK__)纔是程序的入口。由它調用main()函數,如圖3-19所示調用堆棧中,可以看出它們的調用順序。
調用堆棧
二、GameScene.lua文件
GameScene.lua負責建立遊戲主場景,咱們看到的圖3-15所示的場景就是在GameScene.lua中實現的,GameScene.lua主要代碼以下:
r
[html] view plaincopy
equire "Cocos2d"
require "Cocos2dConstants"
--聲明GameScene類
local GameScene = class("GameScene",function() ①
return cc.Scene:create()
end)
--靜態建立函數
function GameScene.create() ②
local scene = GameScene.new() ③
scene:addChild(scene:createLayerFarm()) ④
scene:addChild(scene:createLayerMenu()) ⑤
return scene
end
--構造函數
function GameScene:ctor() ⑥
self.visibleSize = cc.Director:getInstance():getVisibleSize()
self.origin = cc.Director:getInstance():getVisibleOrigin()
self.schedulerID = nil
end
--播放背景音樂
function GameScene:playBgMusic()
local bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename("background.mp3")
cc.SimpleAudioEngine:getInstance():playMusic(bgMusicPath, true)
local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav")
cc.SimpleAudioEngine:getInstance():preloadEffect(effectPath)
end
--建立Dog精靈
function GameScene:creatDog() ⑦
… …
local spriteDog = cc.Sprite:createWithSpriteFrame(frame0)
… …
return spriteDog
end
-- create farm 建立農場層
function GameScene:createLayerFarm() ⑧
local layerFarm = cc.Layer:create() ⑨
… …
return layerFarm
end
-- create menu 建立菜單層
function GameScene:createLayerMenu() ⑩
local layerMenu = cc.Layer:create()
… …
return layerMenu
end
return GameScene
⑪
咱們在GameScene.lua中建立GameScene場景,並在場景中添加了農場層和菜單層。第①行代碼是聲明GameScene場景類,class("GameScene",function(){…})函數是由Cocos2d-x Lua引擎提供的,能夠經過Lua建立建立對象。class函數定義以下:
class(classname, super)
其中參數classname是函數名,它是字符串類型,super是調用父類構造函數。
第②行代碼聲明GameScene.create()靜態函數,在main.lua中經過scene.create()語句調用。第③行代碼local scene = GameScene.new()是建立GameScene建立對象,new()函數會調用第⑥行的GameScene:ctor()函數,ctor()是構造函數,用來初始化GameScene場景對象。第④行代碼是調用GameScene場景對象的createLayerFarm()函數建立農場層(見代碼第⑧行)。第⑤行代碼是調用GameScene場景對象的createLayerMenu()函數建立菜單層(見代碼第⑩行)。
代碼第⑦行函數是建立Dog精靈,使用cc.Sprite:createWithSpriteFrame(frame0)語句建立精靈對象,咱們將在後面詳細介紹。
在建立農場層函數createLayerFarm()中的⑨行local layerFarm = cc.Layer:create()是建立層對象,咱們將在後面詳細介紹。
第⑪行代碼返回GameScene變量,它是table類型,它是在main()函數中調用local scene = require("GameScene")語句時候返回的。
更多內容請關注最新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&categoryId=0
《Cocos2d-x實戰 JS卷》現已上線,各大商店均已開售:
京東:http://item.jd.com/11659698.html
歡迎關注智捷iOS課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息