第一个Cocos2d-x Lua游戏

咱们的编写的第一个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

  1. equire "Cocos2d"                                                        ①  

  2.   

  3. -- cclog  

  4. local cclog = function(...)                                                 ②  

  5.     print(string.format(...))                                               ③  

  6. end  

  7.   

  8.   

  9. -- for CCLuaEngine traceback  

  10. function __G__TRACKBACK__(msg)                                      ④  

  11.     cclog("----------------------------------------")  

  12.     cclog("LUA ERROR: " .. tostring(msg) .. "\n")  

  13.     cclog(debug.traceback())  

  14.     cclog("----------------------------------------")  

  15.     return msg  

  16. end  

  17.   

  18.   

  19. local function main()                                                       ⑤  

  20.     collectgarbage("collect")                                               ⑥  

  21.     -- avoid memory leak  

  22.     collectgarbage("setpause", 100)                                     ⑦  

  23.     collectgarbage("setstepmul", 5000)                                      ⑧  

  24.       

  25.     cc.FileUtils:getInstance():addSearchPath("src")  

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

  27.     cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(480, 320, 0)  

  28.       

  29.     --create scene   

  30.     local scene = require("GameScene")                                      ⑨  

  31.     local gameScene = scene.create()                                        ⑩  

  32.     gameScene:playBgMusic()  

  33.       

  34.     if cc.Director:getInstance():getRunningScene() then                         ⑪  

  35.         cc.Director:getInstance():replaceScene(gameScene)                         

  36.     else  

  37.         cc.Director:getInstance():runWithScene(gameScene)                         

  38.     end  

  39.   

  40.   

  41. end  

  42.   

  43.   

  44.   

  45.   

  46. local status, msg = xpcall(main, __G__TRACKBACK__)                          ⑫  

  47. if not status then  

  48.     error(msg)  

  49. end  



上述代码第①行require是在加载Cocos2d模块,而且能够避免重复加载。第②行代码是声明cclog函数,该函数的做用是输出日志信息。第③行代码print(string.format(...))是输出函数。
第④行代码是声明__G__TRACKBACK__(msg)函数,在程序出错的时候由第⑫行的xpcall调用,并输出堆栈信息。下面是日志输出的堆栈信息:

[html] view plaincopy

  1. [LUA-print] stack traceback:  

  2.     [string ".\src/main.lua"]:13: in function '__index'  

  3.     [string ".\GameScene.lua"]:52: in function <[string ".\GameScene.lua"]:49>  

  4. [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在CODE上查看代码片派生到个人代码片

  1. equire "Cocos2d"  

  2. require "Cocos2dConstants"  

  3. --声明GameScene类  

  4. local GameScene = class("GameScene",function()                              ①  

  5.     return cc.Scene:create()  

  6. end)  

  7. --静态建立函数  

  8. function GameScene.create()                                             ②  

  9.     local scene = GameScene.new()                                       ③  

  10.     scene:addChild(scene:createLayerFarm())                                 ④  

  11.     scene:addChild(scene:createLayerMenu())                                 ⑤  

  12.     return scene  

  13. end  

  14.   

  15.   

  16. --构造函数  

  17. function GameScene:ctor()                                               ⑥  

  18.     self.visibleSize = cc.Director:getInstance():getVisibleSize()  

  19.     self.origin = cc.Director:getInstance():getVisibleOrigin()  

  20.     self.schedulerID = nil  

  21. end  

  22. --播放背景音乐  

  23. function GameScene:playBgMusic()  

  24.     local bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename("background.mp3")   

  25.     cc.SimpleAudioEngine:getInstance():playMusic(bgMusicPath, true)  

  26.     local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav")  

  27.     cc.SimpleAudioEngine:getInstance():preloadEffect(effectPath)  

  28. end  

  29. --建立Dog精灵  

  30. function GameScene:creatDog()                                           ⑦  

  31.    … …  

  32.   

  33.   

  34.     local spriteDog = cc.Sprite:createWithSpriteFrame(frame0)  

  35.    … …  

  36.   

  37.   

  38.     return spriteDog  

  39. end  

  40.   

  41.   

  42. -- create farm 建立农场层  

  43. function GameScene:createLayerFarm()                                        ⑧  

  44.     local layerFarm = cc.Layer:create()                                     ⑨  

  45.     … …  

  46.   

  47.   

  48.     return layerFarm  

  49. end  

  50.   

  51.   

  52. -- create menu 建立菜单层  

  53. function GameScene:createLayerMenu()                                        ⑩  

  54.   

  55.   

  56.     local layerMenu = cc.Layer:create()  

  57.     … …  

  58.       

  59.     return layerMenu  

  60. end  

  61.   

  62.   

  63. 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&amp;categoryId=0

《Cocos2d-x实战 JS卷》现已上线,各大商店均已开售:

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

欢迎关注智捷iOS课堂微信公共平台,了解最新技术文章、图书、教程信息

相关文章
相关标签/搜索