cocos2dx绑定lua并进行代码测试

   看了很多文章和介绍,但是还是一头雾水。之前做过2.x版本,也做过3.4版本。如今需要用lua,但是究竟怎样binding?光说不练假把式。

   关于tolua++的英文翻译可见这个地址:http://blog.csdn.net/ghosc/article/details/7479104(然并卵)

   关于OpenGL的介绍和tutorial可见这个地址:http://www.opengl-tutorial.org/zh-hans/beginners-tutorials-zh/(可以当饭后甜点)

   关于tolua++使用可见这个地址:tolua++实现分析cocos2dx的lua绑定(佩服作者,写的很好)

   刚开始做这件事情的时候,面对很多很长的名字和指令,简直要疯掉,自己摸索着看代码,越看越乱。这些东西太抽象,没有在脑子里形成具体的概念,所以自己抓掉了很多头发。

   

那么,cocos2dx-lua 是如何启动的呢?示例:

   main.cpp—>SimulatorWin.cpp—>AppDelegate.cpp—>lua

   而在lua中的启动顺序如下说明:

   从main.lua开始:
Main.lua是Cocos2d-lua项目的默认入口,即项目启动时,首先执行这个文件。(我们也可以修改config.json文件的entry字段来配置入口文件)
main.lua中进行了几项操作:
a)把res和src两个文件夹添加到文件搜索路径。
b)读取Config.lua加载lua配置信息。执行Cocos.init,这个文件根据配置信息初始化Cocos2d-lua框架(require加载lua模块时必须使用”.”来代替路径中的”/”符号)  
c)创建App文件夹中的App对象,调用run函数,run函数可以有参数,用于配置第一个进入的场景,默认是MainScene。从App对象开始才是是码农朋友们的劳动场所,一般从这里开始添加游戏逻辑。 
Config.luaConfig.lua提供了几个字段用于配置项目,可以修改这些字段的值来达到某些效果: 
DEBUG字段:设置输出调试信息的等级,0为无,1为少量的,2为完全的。其实就是控制几个不同的print函数是否输出。
CC_USE_FRAMEWORK字段:设置是否使用quick框架,包括MVC框架。
CC_SHOW_FPS字段:是否显示FPS等显卡相关信息。
CC_DISABLE_GLOBAL字段:是否允许定义全局变量,具体可看此篇说明:
http://cocoslua.cn/2014/12/disable-global-var/ 
CC_DESIGN_RESOLUTION字段:设置在不同分辨率下,游戏分辨率的调整策略,具体可参考此篇教程:http://cn.cocos2d-x.org/tutorial/show?id=1434 
在执行cocos/init.lua的时候,就会根据上述配置信息,来配置项目。

Cocos-Lua项目自带的MVC框架
自带的MVC框架的基础代码在创建的项目的src/package/mvc中可以找到。这里边有三个文件AppBase.lua、init.lua、ViewBase.lua。
AppBase:算是MVC框架的管理角色,主要管理View对象,比如提供了一些接口用于切换View。 
ViewBase.lua:继承于2d-x的Node类型。但其中的ShowWIthScene接口会创建一个Scene文件,把View自身添加到这个Scene上,并命令全局显示这个Scene。
Init.lua:不用说,看字面就知道,这个用于初始化MVC框架。

基于MVC框架开始给我们的游戏添加逻辑:
MVC框架填充逻辑的地方默认在app文件夹中(res/app或者src/app)。
默认会在这个文件夹下生成MyApp.lua和Views文件夹,我们应该在views中为每个游戏场景添加一个继承自ViewBase的类,加载CocosStudio编辑出来的界面,处理交互、动画等界面逻辑,并调用models中的类处理游戏逻辑;此外我们还需要在这个文件夹下添加一个model文件夹,用来填写游戏的逻辑代码。



MVC具体游戏逻辑的文件结构
在MyApp.lua中,我们可以重写onCreate函数,在这里添加进入第一个游戏界面之前的处理逻辑,我们的示例游戏比较简单,不需要在这里做什么特殊处理。在onCreate执行完之后,紧接着会执行AppBase的run函数,这个函数在Main.lua中调用,这个函数有一个参数,用来决定进入的第一个View,如果不填写这个参数,默认会进入MainScene.lua文件。

主界面: 
MainScene.lua的代码如下:
--MainScene.lua  

-- 创建一个MainScne类,继承ViewBase对象
local MainScene =class( "MainScene" ,cc.load( "mvc" ).ViewBase)
-- 重载onCreate函数
function MainScene :onCreate()
-- 加载CocosStudio编辑出来的MainScene.csb
local root =cc.CSLoader:createNode( "MainScene.csb" )
root :addTo( self )
local function onPlay ()
-- 进入PlayScene,使用闭包catch self变量。
self :getApp():enterScene( "PlayScene" )
end
-- 获取名称为PlayButton的按钮,然后添加这个按钮在接受到点击时的处理代码
root :getChildByName( "PlayButton" )
       :addClickEventListener( onPlay )
end
return MainScene  
大部分逻辑上述代码中的注释都有写明。

游戏界面: 
点击Play按钮,会触发上述代码中的onPlay函数。然后执行下面这句代码:

self :getApp():enterScene( "PlayScene" )
如上:先通过ViewBase的getApp接口获取App对象,然后执行app的enterScene接口,这个接口会根据参数去app/views文件夹下找PlayScene.lua这个文件并加载出来。当然这个文件里边的类必须继承自ViewBase,不继承ViewBase就不能用enterScene加载。
PlayScene.lua 的部分代码如下:
1. 逻辑代码的加载:
local GameLogital =import( "..models.GameLogital" )
MVC 框架没有帮我们自动加载app/models里边的lua代码,需要我们自己去手动加载这些东西。
注:这里使用到import接口而不是require,import是quick框架提供的接口,相比require这个接口使用的是相对路径。
2. 方便的接口:
self .root =cc.CSLoader:createNode( " PlayScene.csb" ):addTo( self)
注意最后的addTo函数,这些函数是quick提供的,在调用完会返回对象本身,所以我们可以像下面这样使用,不需要重复地去写变量名:
cc.Sprite:create(texture):move(x,y):rotate(r):addTo(p)
这些函数可以在src/cocos/framework/extends/下找到。
3. 创建,添加动画:
local tlAct =cc.CSLoader:createTimeline( "PlayScene.csb" )
self .root:runAction( tlAct )
self.act_tag = tlAct:getTag()-- 用于后续获取动画
首先使用cc.CSLoader:createTimeline创建动画,然后使用runAction把这个动画挂载到加载出来的节点上。
4. 播放动画:
local tlAct =self.root:getActionByTag(self.act_tag)
tlAct :gotoFrameAndPlay( 0 , false )
先通过tag获取动画,如上。然后调用gotoFrameAndPlay接口,这个接口有三个重载:
gotoFrameAndPlay(begin,end,loop)
gotoFrameAndPlay(begin,loop)
gotoFrameAndPlay(begin)
参数解释:
Begin :从第几帧开始播放
End: 播放到第几帧
Loop :是否循环



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Valar Morgulish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值