`

第一个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引擎目录>。

配置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运行我们刚刚创建的工程,运行结果如下图所示。

 

运行工程界面

我们主要编写的程序代码是在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工程中主要有两文件下面我们详细解释一下它们内部的代码: 

1、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所示调用堆栈中,能够看出它们的调用顺序。

调用堆栈



2、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

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

 

 

 

 

 

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

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

分享到:
评论

相关推荐

    cocos2D-lua 核心编程内置代码

    1. 场景(Scene):在Cocos2d-lua中,每个游戏状态或屏幕对应一个场景,场景之间可以互相切换。 2. 层(Layer):场景由多个层组成,层是显示内容的基本单元,可以包含精灵、文本、菜单等元素。 3. 精灵(Sprite):...

    Cocos2d-x实战_Lua卷 _第2版

    《Cocos2d-x实战_Lua卷_第2版》是一本专为游戏开发者准备的指南,主要聚焦于使用Cocos2d-x框架与Lua语言进行游戏开发。Cocos2d-x是一个开源的游戏开发框架,它允许开发者用C++、Lua或者JavaScript编写游戏,并且可以...

    cocos2d-x API中文文档

    cocos2d-x是一个基于MIT许可证的开源游戏引擎,它以快速、简单且功能强大的特性闻名,允许开发者使用C++、Lua和JavaScript进行跨平台开发,支持包括iOS、Android、Windows Phone、Blackberry以及Tizen在内的多个平台...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形交互应用。这个“cocos2d-x-3.8.zip”压缩包包含的是cocos...

    Cocos2d-x之Lua核心编程 ,刘克男,杨雍著 ,P227

    2. Cocos2d-x与Lua的集成:Cocos2d-x提供了一个名为Cocos2dx-Lua的模块,使得开发者可以直接使用Lua编写游戏代码。这个模块包含了Lua到C++的绑定,使得Lua可以直接调用Cocos2d-x的API。 3. Lua环境设置:在开始Lua...

    Cocos2d-x实战C++卷关东升著完整版pdf

    Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言为主要编程工具,详细介绍了如何利用Cocos2d-x进行游戏开发。 首先,Cocos2d-x的基础知识是必须...

    Cocos2d-Lua-社区:基于Cocos2d-x 4.0,打造易用稳定的Cocos2d-x lua引擎

    Cocos2d-Lua社区Cocos2d-Lua-Community是Cocos2d-x 4.0的改进,并且易于使用Lua游戏引擎。 它是与Quick-Cocos2dx-Community v3.7.x兼容的Lua“框架”。得到帮助 QQ群:社区版千人群(1群)号:361920466社区版2群:...

    Cocos2d-x学习笔记

    Cocos2d-x框架除了Windows平台外,还支持iOS、Android、Mac OS X、Web等平台,初学者在掌握了Windows平台的开发后,可以进一步学习如何使用Cocos2d-x跨平台开发,实现一个游戏在多个平台上运行。 在学习过程中,...

    cocos2d-x 案例开发大全 第二章(源码)

    《cocos2d-x案例开发大全》第二章的源码主要涵盖了使用cocos2d-x进行游戏开发的各种实践技巧和示例。cocos2d-x是一个开源的游戏开发框架,基于C++,支持跨平台,包括iOS、Android、Windows等多个操作系统。本章的...

    cocos2d-lua整合到ios工程

    Cocos2d-x是一个强大的跨平台2D游戏开发框架,而Lua是一种轻量级的脚本语言,易于学习且适合游戏逻辑编写。本文将详细介绍如何将Cocos2d-x Lua项目整合到iOS工程中,以便在iOS应用中运行Cocos2d-x的lua脚本,实现...

    cocos2d-x 3.x游戏开发实战光盘

    《cocos2d-x 3.x游戏开发实战光盘》是一个深入探讨cocos2d-x 3.x游戏引擎开发的资源集合,旨在帮助开发者通过实际案例掌握这一强大的2D游戏开发工具。cocos2d-x是一款开源的游戏开发框架,基于C++,广泛应用于跨平台...

    迷失航线-Cocos2d-x项目实战-射击类游戏-关东升

    Cocos2d-x是一个开源的游戏开发框架,它使用C++作为主要编程语言,同时支持Lua和JavaScript,广泛应用于2D游戏开发。在这个项目实战中,我们将深入探讨如何利用Cocos2d-x 3.2版本构建一款完整的射击游戏。 首先,...

    Cocos2d-x《开心斗地主》棋牌类游戏源码

    Cocos2d-x是一个跨平台的2D游戏开发框架,由C++编写,支持iOS、Android、Windows等多个操作系统。它以其高效、易用的特点,深受游戏开发者喜爱。 在这款游戏中,你可以看到Cocos2d-x的强大功能被充分展示。首先,...

    精通COCOS2D-X游戏开发进阶卷

    《精通COCOS2D-X游戏开发进阶卷》是一本深入探讨Cocos2d-x游戏引擎的专业书籍,旨在帮助开发者提升在Cocos2d-x框架下的游戏制作技能。Cocos2d-x是一款广泛使用的开源游戏开发框架,它基于C++,同时也支持Lua和...

    Cocos2d-x实战:Lua卷(第2版)书籍代码

    这是书籍 Cocos2d-x实战:Lua卷(第2版)的代码,关东升老师的,这里分享出来。除了章节的小示例代码外,还有一个《迷失航线》的游戏示例代码。这是一个下载地址。

    Cocos2d-x 3.X游戏开发实战 (肖文吉) 完整pdf

    1. **Cocos2d-x框架介绍**:Cocos2d-x是基于C++的,但同时也提供了Python、Lua和JavaScript的绑定,方便开发者选择合适的语言进行游戏开发。它提供了一套完整的2D渲染引擎、物理引擎、动画系统、粒子系统以及场景...

    cocos2d-lua 实现富文本

    在游戏开发领域,Cocos2d-x 是一个广泛使用的开源跨平台2D游戏引擎,而 Lua 是一种轻量级的脚本语言,常被用作 Cocos2d-x 的脚本接口,即 Cocos2d-lua。在这个场景下,“cocos2d-lua 实现富文本”意味着我们要探讨...

    cocos2d-x-Introduction.zip_cocos2d_cocos2d-x

    cocos2d-x是一款强大的跨平台游戏开发引擎,被广泛应用于iOS、Android、Windows等多个操作系统上。它以其高效、易用的特性,为开发者提供了一套完善的2D游戏开发解决方案,极大地简化了游戏开发流程。 一、cocos2d-...

    Cocos2d-x 使用Lua开发基础

    Cocos2d-x是一款开源的游戏开发框架,...总结来说,Cocos2d-x结合Lua提供了强大的游戏开发能力,让你能在多个平台上快速构建高质量的2D游戏。通过理解并掌握上述知识点,你将能够高效地利用这个组合来实现你的创意。

Global site tag (gtag.js) - Google Analytics