展会信息港展会大全

第一个Cocos2d-x Lua游戏
来源:互联网   发布日期:2015-09-28 11:07:51   浏览:1664次  

导读: 我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容。 创建工程 我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具...

我们的编写的第一个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中选择。配置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

equire Cocos2d①

-- cclog

local cclog = function(...)②

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

end

-- for CCLuaEngine traceback

function __G__TRACKBACK__(msg)④

cclog(----------------------------------------)

cclog(LUA ERROR:.. tostring(msg) ..

)

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调用,并输出堆栈信息。下面是日志输出的堆栈信息:[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所示调用堆栈中,能够看出它们的调用顺序。调用堆栈

2、GameScene.lua文件

GameScene.lua负责创建游戏主场景,我们看到的图3-15所示的场景就是在GameScene.lua中实现的,GameScene.lua主要代码如下:

r

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)语句时候返回的。

引擎目录>

赞助本站

人工智能实验室
AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港