quick-cocos2d-x(后文简称 quick)与 cocos2d-x 的关系,用一句话概括:quick 是 cocos2d-x 针对 Lua 的豪华套装威力加强版。


项目地址:quick-cocos2d-x 项目 Wiki: wiki


那 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 平台 YES YES
Android 平台 YES YES
Windows 平台 YES YES
Mac 平台 YES YES
Linux 平台 YES* YES
HTML5 平台 NO YES
JIT 支持 YES YES
编译为字节码 YES YES
字节码是否可以反编译 NO NO
运行性能 HIGH LOW
接入 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 -

cocos2dx和quick的区别的更多相关文章

  1. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  2. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  3. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  4. ios – 以编程方式在Swift中添加联系人

    我想在Swift中以编程方式添加联系人.我发现了一些Objective-C示例,但我没有让它们工作,甚至在Objective-C中也没有.我不希望这涉及到AddressBookUI,因为我想从我自己的UI中获取值.解决方法这是在Swift中添加联系人的快速方法.我在我的iPhone5iOS7.1上验证了它,因为我发现模拟器并不总是与我的手机对AB的东西相同.您可以添加一个按钮并指向此方法:顺便说一下–它假设你已经分配了一个地址簿var,你可以通过覆盖viewDidAppear来打开视图.它也会执行安全提示

  5. ios – 为目标c中的方法传递未知类型的参数,可能吗?

    是否可以将未知类型的参数传递给objective-C方法?在C#中你可以写实现这一点,但我知道Objective-C没有泛型,所以有没有其他方法可以在Objective-C中实现这一点?我需要这个,因为我想创建一个方法来改变不同对象的文本颜色,如UITextField和UIButton的占位符文本.所以我的计划是创建一个名为textWhite的方法,然后在此方法中检查对象的类型,然后运行匹配的代码以使文本颜色变为白色.解决方法是的,可以传递未知类型的参数.见下面的例子.请参考使用id对象的链接作为参数Us

  6. ios – Swift指针算术和解除引用;将一些类似C的地图代码转换为Swift

    我有一点似乎没有工作的Swift代码……解决方法您正在指定locationPointer指向新位置,但仍在下一行中使用ptr,并且ptr的值尚未更改.将您的最后一行更改为:或者你可以改变指向var的指针并推进它:

  7. ios – “禁用模块时使用’@import’”错误 – 启用模块和链接框架= YES

    我有一个使用CocoaPods并使用’SCLAlertView-Objective-C’窗格的项目.该pod使用@importUIKit;模块样式导入.我在目标和项目设置中将“启用模块(C&Objective-C)”和“自动链接框架”设置为YES.当模块被禁用时,我仍然得到“使用’@import’错误.有没有什么可以阻止Xcode能够启用模块,如使用.pch文件,任何链接器标志,或者我没有提到的任

  8. XCode 6.3立即在抛出的Objective-C异常上引发SIGABRT

    考虑以下目标-C代码在XCode6.2中,它按预期工作(记录“错误消息”).但是,由于我们升级到6.3,抛出行(throwstd::logic_error…)引发SIGABRT(堆栈跟踪仅包含_cxa_throw和_pthread_kill,超出applicationdidFinishLaunchingWithOptions)并导致应用程序崩溃.这只发生在我们的应用程序中–当我将完全相同的代码复制

  9. ios – 在swift框架中使用Bridging Headers时失败

    我正在做一个快速的框架,我想使用旧的目标c类.为此,我使用桥接头方法但是当我尝试构建时出现此错误:我将我的{PROJECT}-Bridging-Header.h添加到Swift编译器中的Objective-C桥接头–代码生成我怎么解决它?

  10. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部