quick-cocos2d-x(后文简称 quick)与 cocos2d-x 的关系,用一句话归纳:quick 是 cocos2d-x 针对 Lua 的豪华套装威力增强版。
那 quick 与 cocos2d-x 相比到底有什么区别,又有什么增强呢?这篇文章就是答案:
为何会有 quick
quick 和 cocos2d-x 的差异
quick 由哪些部分组成
应该选择 Lua 仍是 JavaScript
怎么入门 quick
为何会有 quick
cocos2d-x 是一个用 C++ 开发的游戏引擎,其架构设计和 API 基本上是照搬的 cocos2d-iphone(一个用 Objective-C 的 iOS 游戏开发引擎)。
因为 C++ 对开发人员要求较高,因此网龙科技利用 tolua++ 这个工具,将 cocos2d-x 的 C++ 接口转为了 Lua 接口(这种将 C++ 接口导出为 Lua 接口的库一般称为 luabinding)。让开发者可使用 Lua 这种简单易懂的脚本语言来编写游戏,从而大大提升开发效率。
大概在 2012 年上半年,咱们公司开始使用 cocos2d-x + Lua 来开发游戏。可是发现当时 cocos2d-x 对 Lua 的支持还存在至关多不完善的地方。因此我重写了整个 luabinding 的支持代码,解决了内存泄露、只能使用全局函数作回调等问题。
在 cocos2d-x 2.0 发布后,luabinding 又进行了很多改进和完善。截止到 cocos2d-x 2.1.4,整个 luabinding 已经能够说是至关稳定了。因此《我是 MT》、《大掌门》这些赚钱像印钱的游戏,就纷纷采用 cocos2d-x + Lua 的解决方案了。
惋惜 cocos2d-x 团队从 2012 年以来一直在强力推广 cocos2d-x 的 JavaScript 解决方案,因此在 Lua 支持上基本上就没有什么大动做了。而从咱们使用 Lua 解决方案的开发商看来,须要 luabinding 具有更强大的功能,所以这就是咱们开发 quick 的最初缘由。
quick 的目标:
下降学习曲线
提升易用性
建立一个精简、但更容易扩展的架构
quick 和 cocos2d-x 的差异
虽然 cocos2d-x luabinding 已经很完善了,可是要开发一个游戏,咱们还须要作许多基础工做。
将 luabinding 导出的 C++ 接口从新封装成 Lua 风格的接口是最基本的工做。从新封装后的接口应该更容易学习和使用,而且一些 C++ 和 Lua 之间数据格式转换也应该隐藏起来。而这就是 quick 里首先实现的目标。
看看下面的代码:
-- 载入 Sprite Sheet
local frameCache = CCSpriteFrameCache:sharedSpriteFrameCache()
frameCache:addSpriteFramesWithFile("Sprites.plist", "Sprites.png")
-- 构造一个帧动画序列 Run0001.png -> Run0010.png
local frames = CCArray:create()
for index = 1, 10 do
local frameName = string.format("Run%04d.png", index)
local frame = frameCache:spriteFrameByName(frameName)
frames:addObject(frame)
end
-- 建立 CCSprite 对象
local firstFrame = tolua.cast(frames:objectAtIndex(0), "CCSpriteFrame")
local sprite = CCSprite:createWithSpriteFrame(firstFrame)
-- 在 CCSprite 之上播放动画(用 0.5 秒播放完 10 帧)
local animation = CCAnimation:createWithSpriteFrames(frames, 0.5 / 10)
sprite:runAction(CCRepeatForever:create(CCAnimate:create(animation)))
这段代码的功能在游戏中会反复出现,因此一般会封装成几个简单的函数。而 quick 里封装后的接口要完成一样功能会使用以下代码:
display.addSpriteFramesWithFile("Sprites.plist", "Sprites.png")
local frames = display.newFrames("Run%04d.png", 1, 10)
local sprite = display.newSpriteWithFrame(frames[1])
local animation = display.newAnimation(frames, 0.5 / 10)
sprite:playAnimationForever(animation)
经过这个对比,能够看出二次封装是多么必要。而 quick 提供了一个 Lua Framework,封装了大量最经常使用的接口。
cocos2d-x 是一个功能完善的游戏引擎,但对于一个能挣钱的游戏来讲,cocos2d-x 还缺乏不少必须的功能。因此 quick 在 cocos2d-x 基础上添加了更多游戏必须的功能,例如完善的 HTTP 和 Socket 网络功能、数据加密解密、设备功能访问等等。
游戏的玩法作得差很少了,就须要开始集成付费充值、统计、社会化分享、好友链等各类第三方 SDK。
在 iOS 和 Android 平台上作这些工做,传统作法是分别编写 Objective-C 和 Java 的接口代码,而后再用 C++ 中转,借助 tolua++ 导出给 Lua 使用。这种作法不但繁琐,并且像 Java 和 C++ 的交互存在至关多的困难,因此开发效率极低。
quick 针对这个问题,特别开发了 LuaObjectiveCBridge 和 LuaJavaBridge 两个模块。利用这两个模块,咱们在接入 SDK 时,就再也不须要 C++ 中转层,也不须要 tolua++,由此省下的工做量至关惊人。
并且 quick 的附属项目会提供大量现成的 SDK 封装,进一步提升开发效率,让开发商把主要的资源花在游戏玩法上。
在开发过程当中,须要不断测试。而 cocos2d-x 自带的 Windows 和 Mac 模拟器功能太简单。quick 特别开发了功能完备的模拟器,让整个游戏在开发阶段的大部分时间里都不须要借助真机就能够进行(小伙伴们都知道,Android 真机调试那么是多么的蛋疼)。
看看 quick 华丽的模拟器吧 :)
除了上述内容,quick 里还包含了物理引擎 Chipmunk 2D 的 Lua 封装(相信我,你不可能找到比这个更容易使用的物理引擎接口)、骨骼动画播放(支持 DragonBones、CocoStudio)、高性能的 LuaJIT 虚拟机等等。
总结而言,quick 和 cocos2d-x 的主要区别有以下几点:
更完善的 Lua 支持,包括一个 Lua 框架对 C++ 接口进行了二次封装
补充了大量 cocos2d-x 没有提供,但游戏须要的功能
为提升开发效率,提供了 Objective-C 和 Java 的桥接模块,以及强化的 Windows/Mac 模拟器
除了这些重大区别外,quick 还在细节上作了一些调整和完善。而且后续还会未来自 cocos2d-x 最新开发分支(devel 3.0)的一些重要 bugfix 和有价值的新功能移植到 quick 中。
固然,当 cocos2d-x 3.0 彻底稳定下来的时候,quick 也会作相应的升级。
quick 由哪些部分组成
quick 由几个主要部分组成:
cocos2d-x:目前基于 cocos2d-x 2.1.4 版本
tolua++:用于将 C++ 接口导出给 Lua 脚本使用
LuaJIT:最快的 Lua 虚拟机
cocos2d-x-extra:扩展功能,包括数据加密编码、网络传输、设备功能访问等
Chipmunk 2D:物理引擎,以及相应的 cocos2d-x 和 Lua 封装接口
CSArmature:一个骨骼动画播放库,支持 DragonBones 和 CocoStudio 建立的骨骼动画
除此以外,还包含一些 Lua 的扩展:
lua_extensions:一些必备的 Lua 模块,包括 JSON、ZLib、LuaFileSystem、LuaSocket 等
LuaJavaBridge:简单的 Lua - Java 交互接口,简化 SDK 集成
LuaObjectiveCBridge:简单的 Lua - Objective-C 交互接口
应该选择 Lua 仍是 JavaScript
目前 cocos2d-x 支持两种脚本语言的 binding,从我我的了解,各自的状况列表以下:
Features Lua JavaScript
彻底访问 cocos2d-x API YES YES
iOS 平台 YESYES
Android 平台 YESYES
Windows 平台 YESYES
Mac 平台 YESYES
Linux 平台 YES*YES
HTML5 平台 NOYES
JIT 支持 YESYES
编译为字节码 YESYES
字节码是否能够反编译 NONO
运行性能 HIGHLOW
接入 SDK 工做量 简单复杂,经过 C++ 中转
导出自定义 C++ 类 简单复杂
而我最看重其中几点:
运行效率:LuaJIT 编译的字节码在 JIT 可用时,运行效率能够接近 C 的程度。而在 iOS 这种不支持 JIT 的环境里,Lua 的运行效率比 JavaScript 高不少()。
是否容易扩展:Lua 从设计时就是做为嵌入式语言来设计的,因此须要将某个 C/C++ 接口导出给 Lua 使用,那是至关轻松的事情。
源代码保护:LuaJIT 编译的字节码目前是没法反编译的,由于 LuaJIT 在编译时不是 1:1 直接转换源代码,而是对源代码作了至关多的深刻优化。LuaJIT 编译出的字节码体积是 Lua 编译字节码的三分之一,因而可知优化程度。
客观的说,JavaScript binding 最大的优点是之前大量的 JS 前端开发人员能够很容易的上手,并且支持 HTML5 平台。但若是从手游体验来讲,Lua 的运行效率是很重要的优点。
怎么入门 quick
东西再好,学不会也是白搭,因此这篇文章的重点是这个部分,前面都是广告 :)
学习 Lua
Lua 是一种简单易用的语言。学习这种语言最好的方式就是花几天时间写代码,而后在命令行中运行。
重点:
table 在 Lua 中是一种万能数据结构,既能够表示数组,又能够表示名值对。这和 PHP 里的 array 同样。惟一的区别在于 table 用做数组时,第一个元素的下标是从 1 开始。
function 在 Lua 里是 first-class 类型,也就是说你能够把一个 function 当作普通值,传递来传递去,这和其余函数式编程语言是同样的,例如 JavaScript。
Lua 里用 table 配合 metatable 实现面向对象。因为 C++ 对象导出到 Lua 里后就是这样的机制,因此这个必定要搞明白。
搞清楚在定义方法和调用方法的时候,用“.”和“:”的区别。
尝试修改和完善 quick 的各个示例程序
用 quick-x-player(quick 里牛叉的模拟器)运行 sample 目录里的各个例子,无差异爆改。改一点就按 F5(Mac 上按 CMD+R)刷新模拟器看看效果(作过 Web 前端的童鞋感动吧),要不了几天就成熟练工了。
最常遇到的问题:
这个方法返回了一个什么对象?
由于 quick 里对 C++ 接口进行了二次封装,因此一些框架的方法返回的对象不必定很明确。但大多数能够从方法名上推测出来:
display.newSprite() 建立 CCSprite 对象
display.newFrames() 建立包含多个 CCSpriteFrame 对象的数组
ui.newImageMenuItem() 建立 CCImgeMenuItem 对象
ui.newMenu() 建立 CCMenu 对象
实在看不出来,那就去 framework 目录里翻源代码吧。
这个方法是干吗的?
首先,从 framework 里找。找不到就去 cocos2d-x 里找。还找不到,那就是 cocos2d-x-extra 或者第三方库提供的方法。这里强烈推荐 Sublime Text 这个超神的编辑器,全文检索神马的彻底不在话下。
为何代码没有预期的效果?
无论是 Lua 仍是 quick,当前的版本都很是很是稳定。因此遇到这种状况,不要首先怀疑语言特征或者引擎,而是多作测试,看看问题究竟是怎么发生的。
在哪里寻求帮助?
目前 quick 尚未专门的社区,因此若是你想寻求帮助,最快捷的途径就是 QQ 群:284148017 。固然,不会有谁整天没事儿在那里义务解答,因此 QQ 群更可能是交流经验的地方。将来,quick 会创建本身的社区,方便你们的交流。
熟悉 cocos2d-x API
本质上,quick 是 cocos2d-x 的一个加强版本,因此熟悉 cocos2d-x API 是基本要求。好在 cocos2d-x 目前已经有至关丰富的学习资料,即使是 C++ 代码的,改写为 Lua 也很是简单,也就语法的区别而已。
这个阶段能够用 quick 里的 CoinFlip 示例为基础,添加更多玩法或功能。CoinFlip 已经具有一个完整游戏的雏形,因此可以在 CoinFlip 中自在添加功能时,也就达到能够独立开发游戏的程度了。
学习使用扩展功能和第三方 Lua 扩展
quick 里包含了至关丰富的扩展库,从支付到网络服务都应有尽有。而这些功能也是游戏从项目变成产品时必须的,因此在熟练掌握扩展功能能够大大提升开发效率,避免重复劳动。
在学习扩展功能时,要了解这个扩展功能是基于什么开源项目来开发的,这样才能找到有针对性的学习资源。例如 LuaSocket、LuaFileSystem 等 Lua 扩展、Chipmunk 2D 物理引擎等等,它们的用法在各自项目的网站上都能找到。
导出本身的 C++ 对象到 Lua
有时候须要编写一些 C++ 对象,而后导出给 Lua 使用。这里能够参考 lib/cocos2dx_extra/extra/luabinding 里的 *.tolua 文件,将 C/C++ 头文件转为 tolua++ 须要的文件,而后借助 quick 中附带的脚本编译成 luabinding 接口。
在 quick 项目的 wiki 中,也有其余相关的文档能够参考。
集成第三方 SDK
quick 有一个附属仓库 quick-cocos2d-x-plugins,其中包含了一些 SDK 的接口文件。参考 sample/luajavabridge 示例和这些接口文件,很容易就能完成 SDK 的集成。
后续 quick 也会提供更多的 SDK 接口,以及相应的示例代码。
- END -前端
转自:http://blog.csdn.net/kaitiren/article/details/35276177java