Quick-cocos2d-x 与COCOS2DX 区别

http://www.jb51.cc/article/p-tgvvjarj-ea.html

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
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 的目标:
降低学习曲线
提高易用性
创建一个精简、但更容易扩展的架构
虽然 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",51); font-family:Arial; font-size:14px; line-height:26px">local frames = display.newFrames("Run%04d.png",1,10)
local sprite = display.newSpriteWithFrame(frames[1])
local animation = display.newAnimation(frames,51); font-family:Arial; font-size:14px; line-height:26px">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 由几个主要部分组成:
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 交互接口
目前 cocos2d-x 支持两种脚本语言的 binding,从我个人了解,各自的情况列表如下:
Features Lua JavaScript
完全访问 cocos2d-x API YES YES
iOS 平台 Android 平台 Windows 平台 Mac 平台 Linux 平台 YES* HTML5 平台 NO JIT 支持 编译为字节码 字节码是否可以反编译 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 的运行效率是很重要的优势。
东西再好,学不会也是白搭,所以这篇文章的重点是这个部分,前面都是广告 :)
学习 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 -

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是