摘 要
随着智能设备平台的普及、用户数量的增多,智能平台的应用,尤其是游戏异常火爆,从植物大战僵尸到愤怒的小鸟,移动平台游戏的开发进入了新的阶段。但是另一方面,平台的多样性也给开发者带来诸多不便,怎样将一款游戏发布到多个平台也是开发者们一直在探索的问题。特别是随着Android和iOS平台的兴起,开发者的游戏跨平台的需求更强了,随机Cocos2D-X分支诞生。其中“x”包含了两个意思:一方面是C++的文件扩展CXX,“x”表示该项目是由C++编写的;另一方面意味着交叉,这个开源项目的目的是让用户创建跨平台的代码。Cocos2d-x使用C++重写的Cocos2D-x框架,因为Android和iOS均支持C++。
因为Cocos2d-x具有跨平台的特点,再加上Cocos2d全球社区的支持,Cocos2d框架简单易学、十分容易快速上手,因为Cocos2d-x迅速成为开发者的首选。经过一段时间的发展,众多开发者使用Cocos2d-x开发出了多款游戏,包括捕鱼达人、地铁总动员等。
关键字:智能设备、Cocos2D-X、游戏、Android;
目 录
一、绪论 1
(一)开发背景 1
(二)国内外研究现状 1
(三)游戏开发目的及意义 2
(四)本课题所研究的内容 3
二、开发技术和相关理论介绍 4
(一)Cocos2D-X游戏引擎概述 4
(二)C++的特点 5
三、系统概要设计 7
(一)设计思路与原理 7
(二)系统开发与选用 7
四、游戏详细设计与实现 9
(一)游戏主要设计 9
(二)游戏成果图 12
五、研究目标与主要特色 14
(一)研究目标 14
(二)主要特色 14
结论 16
致谢 17
参考文献 18
一、绪论
手机游戏,在过去一段较长的时间里,基本都是基于J2ME(Java 2 Micro Edition),但是由于Java是一种编译成字节码后在解释执行的语言,所以在效率上远远比不上c/c++,而游戏却十分讲究效率,因为一旦效率低下,会直接影响玩家对游戏的体验,即便游戏做得再好再漂亮,没有一个良好的体验,也不能为玩家所接受。随着科技的发展,特别是近几年智能手机系统的兴起,J2ME逐渐退出舞台。取而代之的是针对各自主流游戏手机系统的语言的兴起,例如IOS的Object-C,Android和Java和 Windows Phone的C#,即使后者也是运行在虚拟机上的,但是厂商已经针对自身平台对它们做了特殊优化,所以效率上也远远超过J2ME,但是手机系统平台多的今天,如果每一个游戏都用多种语言复习,这种时间和资源的代价是很高的。于是,c/c++的高效率和跨平台能力有一次等到体现。
(一)开发背景
Cocos2D-X游戏引擎是一个支持多平台的2D手机游戏引擎,使用C++开发,基于Opengl ES,基于Cocos2D-iPhone,支持WoPhone,IOS4.1,Android2.1及更高版本,Windows XP&Windows 7,Windows Phone 8。
Cocos2d-x是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C++ Cocos2d-iPhone项目的版本。Cocos2d-X发展的重点是围绕Cocos2d跨平台,Cocos2d-x提供的框架。手机游戏,可以写在C++或者Lua中,使用API是Cocos2d-iPhone完全兼容。Cocos2d-x项目可以很容易地建立和运行在iOS,Android,黑莓Blackberry等操作系统中。Cocos2d-x还支持Windows、Mac和Linux等桌面操作系统,因此,开发者编写的源代码很容易在桌面操作系统中编辑和调试。
(二)国内外研究现状
我们的国内现状还是没有比国外有过大的差距的。我曾经玩过数字巧克力的一款盖楼的游戏,扎眼一看只是一个搭积木的游戏,但却能让你一连玩几个小时游戏,变化无穷,游戏的设计者花了多少心思在其中可见一斑。而国内我也遇到过类似的例子。如上海幽幽推出的一款名为八卦西游勇闯盘丝洞的游戏,其实这就是一款简单的走迷宫游戏,但是与西游题材相结合后加上搞笑的对白与画面效果是整体游戏便有了一个升华。同样是让人沉迷其中。但是我还是想说一句,很多这样的游戏并没有变成产品,变成产品的那些一半以上没有上线,上线的那些一半因为制作中的某些环节,也已经面目全非,最初的那点创意根本没有体现出来。所以我觉得我们国内根本不缺好的创意,只是种种的原因导致这些创意没有很好的体现出来。所以那“种种原因”才是我们需要关心的。
在智能手机上的游戏,无论是技术还是创意,国内可以说是完全跟着国外走。首先,在技术上,Cocos2D-X虽然是国人在维护,但追溯到Cocos2D-X起源,2008年出生与阿根廷的Ricardo Quaesada用Python开发出Cocos2D,2010年Cocos2D的团队吧Cocos2D移植到IOS平台,命名为Cocos2D-iPhone,2011年,由国人领导的团队吧Cocos2D-iPhone用c++翻译,Cocos2D-X诞生,往后的一两年里,Cocos2D的其他分支陆续诞生,而Cocos2D-X因为强大的移植性得到广泛使用,现在无论在App Store还是Android的各个商城上,用Cocos2D-X开发的游戏也数不胜数。
其次,在游戏创意上,物理游戏大多是偏向于益智类,如有名的《愤怒的小鸟》和《扑鱼达人》等等,物理游戏最大的特点是游戏世界与现实世界相近,能使玩家更容易思考和了解生活中的物理现象,具有很好的教育性和趣味性。
(三)游戏开发目的及意义
在市场定位的过程中,游戏产品属于文化范畴,对于游戏玩家来说,其实所以会选择自己喜欢的游戏,就是因为想要在娱乐上得到一个满足。而相应的对于游戏开发商来说,我们就应该迎合这样的一个需求,满足市场上的消费者的需求,就是要在开发游戏的过程中,找到游戏玩家真正需要的,找准明确的市场定位,将游戏的开发和后期的服务升级等,都以消费者为最终的出发点。
物理游戏有很多其他游戏不可比拟的优势。首先,它设定的世界和现实世界很接近,其实世界存在的很多属性,在游戏世界里都能一一重现,对幼龄玩家了解生活、了解物理很有帮助;其次,物理游戏里可以实现很多生活中难以接触,甚至是不存在的物体,这样可以使玩家的想象力和逻辑能力得到很好的锻炼。
综上所述,物理游戏有着很好的教育意义。往日,一提及游戏,家长总会想到“沉迷”、“段落”这些贬义词与,而娱乐有时生活中必不可少的东西,物理游戏正正可以成为游戏正名,它是娱乐,但是它又把教育和游戏相结合,可以在游戏过程中潜移默化的影响玩家,引起玩家的思考,激发起玩家学习的主观能动性。
(四)本课题所研究的内容
本课题主要研究基于cocos2d-x开源游戏引擎,在window7操作系统平台下,使用Microsoft Visual Studio 2010开发工具进行开发。在技术实现上,采用基于C++相结合,以实现基本的游戏逻辑流程,保证系统的高性能,提高本游戏的可维护性和可移植性。
在整个游戏开发中,首先对游戏的设计和需求进行了详细的考究,查阅大量的相关资料以及翻阅老师所提供的游戏资料,并且借鉴了一些其他物理游戏的开发经验及老师的专业指导,最后提出设计方案。
二、开发技术和相关理论介绍
(一)Cocos2D-X游戏引擎概述
1、Cocos2D-X的特点
其除跨平台外,相对其他的移动游戏引擎还有以下特点:
(1)易用性:易于学习掌握的API,大量实例代码和文档,有C++语言功底的新手只需花一个月就能上手完成简单游戏;
(2)高效性:使用OpenGL ES1.1最佳方式进行渲染;
(3)灵活性:易于扩展,易于与其他开源库集成使用;
(4)活跃的社区:全球化的活跃论坛;
(5)成功商用:根据开源社区的保守统计,基于Cocos2d-x开发的游戏全球范围内已经突破一亿安装量。
2、Cocos2D-X的功能
(1)非常容易的进行不同场景之间的流程控制管理;
(2)菜单维护简;
(3)支持标签和html标签的文本渲染;
(4)快速而方便的精灵;
(5)按照你的想法只会精灵变化,可组合的动作,包括移动、旋转和缩放;
(6)支持包括波浪、旋转和透镜等特效;
(7)支持矩形和六边形的瓦片地图(Tiled Maps);
(8)支持场景切换特效;
(9)支持粒子系统;
(10)支持硬件加速,即基于opengl es1.1实现图形渲染系统;
根据不同屏幕分辩率自动缩放适配;
关于Cocos2D-X中的“X”,“X”有两个意思,一个是表示“C++”,因为有时候,C++文件的后缀名可以用cxx代替,因此X便表示该开源项目使用C++编写,并且提供C++的API,二是表示“Cross”该开源项目的目标是跨更多平台。目前支持的平台是在iPhone,Andorid的,WoPhone,Win32平台上,但可根据要求提供更多的平台。
Cocos2D-x继承了Cocos2D的全部特点,包括如下内容:
(1)流程控制:非常容易地管理不同场景之间的流程控制。
(2)精灵:快速而方便的精灵。
(3)动作:可组合精灵的动作(如移动、旋转和缩放等),使精灵动起来。
(4)特效:包括波浪、旋转和透镜等特性。
(5)平面地图:支持平面地图和45度角地图。
(6)转换:从一个场景移动到另外一个不同的场景。
(7)菜单:创建内部菜单,包括主菜单和游戏菜单。
(8)文本渲染:支持文本渲染标签。
(9)文档:包括编程指南、API参考、视频教学和很多简单的测试例子。
4、Cocos2D-X的应用
由于跨平台的特性,Cocos2D-x得到了诸多开发者的喜爱。截至2012年4月月底,使用Cocos2D-x开发的游戏有200多个,同时有很多用Cocos2D-iPhone开发的游戏的移植版本。
开发者也尝试着使用Cocos2D-x实现很多不同游戏中的效果。CocoaChina论坛举办的特效大赛中,很多特效都基于Cocos2D-x游戏引擎开发。从显示水波纹效果到塔防游戏例子,从切绳子特效到“愤怒小鸟”太空版效果模拟,Cocos2D-x的“江湖霸主”地位初步显现。
(二)C++的特点
C++的主要特点有两个方面:全面支持C语言和面向对象;
C++从C语言发展而来,保持了C语言的简介、高效和在某些操作上沿用了汇编语言指令的特点。同时,对C语言的类型进行了系统的改革和扩充,堵塞了C语言中的许多漏洞,C++便已提供了更好的类型检查和编译时的分析,能检查出更多的类型错误。C++改善了C语言的安全性,比C+语言更安全。
由于C++保持与C语言兼容,这就是许多代码并不经修改就可以在C++编译器下通过,用C语言编写的众多库函数和实用软件可方便地移植到C++中。因此,使用C语言的程序员能很快学会C++,使用C++进行编程。另外,用C++编写的程序可读性号,代码结构更为合理。
C++的最重要的特点是支持面向对象的程序设计,使用C++编程,编程效率高;由于面向对象更接近人类认识世界的方法,C++对于问题更容易描述,程序更容易理解和维护,C++的模板对库代码的重用提供了支持;C++更有利于大型程序设计。
C++是一种支持多种程序设计方法的语言,提供对过程化和基于对象的程序设计方法的支持。使用于不用使用开发方法的编程人员。
C++是一种可以撰写跨平台应用软件的面向对象的程序设计语言,C++技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网。
游戏的设计思路有以下几点:
(1)游戏分为几个相对独立的模板,但这些模板都进行集中式管理。
(2)分层的模板化程序设计思路,整个游戏采用模板化结构设计。作为应用程序有较强的靠操作性和扩展性。
(3)合理的数据流设计,在应用游戏设计中,相对独立的模板间以数据流相互连接,使各模板间的耦合性较低,方便游戏运行,提高游戏健壮性。
三、系统概要设计
(一)设计思路与原理
1、设计思路
(1)游戏分为几个相对独立的模板,但这些模板都进行集中式管理。
(2)分层的模板化程序设计思路,整个游戏采用模板化结构设计。作为应用程序有较强的靠操作性和扩展性。
(3)合理的数据流设计,在应用游戏设计中,相对独立的模板间以数据流相互连接,使各模板间的耦合性较低,方便游戏运行,提高游戏健壮性。
1、设计原理
为了是本游戏趣味性丰富,操作简单,最大限度的提高游戏的质量,从而让用户的体验到游戏的乐趣,在设计开发过程中遵循了如下原则:
(1)合法性原则:游戏道具和物体不会出现非物理现象。
(2)准确性原则:摆放道具位置相同时,不会出现多重结果。
(3)趣味性原则:完全按照策划来实现道具的功能和效果。
(4)易操作原则:要求设计的游戏界面友好,操作方便,必要的地方进行提示。
(5)可读性原则;为了便于其他设计,维护人员读懂代码或以后的代码修改,游戏升级维护,即尽可能地做好做好代码注释工作。
(6)优化性原则:为了达到优化的目的,采用面向对象的设计模式,是程序简单明了,也方便将来的维护。
(二)系统开发与选用
1、操作系统的选用
操作系统采用微软的桌面操作系统Windows7。Windows7是微软继windowsXP后又一划时代的系统版本,无论在性能上还是在用户体验上都有相当强大的优势。
C++是一种可以撰写跨平台应用软件的面向对象的程序设计语言,C++技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网。
2、开发工具的使用
(1)Microsoft Visual Studio 2010:用于游戏整体框架搭建和代码编写。
(2)Microsoft Visual C++ 6.0:用于游戏整体框架搭建和代码编写。
(3)Photoshop:用于对系统上的一些图片进行美工和制作。
(4)Microsoft Office Word 2007:用于对论文的编写和资料的收集保存。
四、游戏详细设计与实现
(一)游戏主要设计
游戏界面的设计,包含了游戏的开始和游戏的退出:
CCLayerColor::initWithColor(ccc4(0, 255, 255, 50)); //背景的颜色
CCSprite *pSprite = CCSprite::create(“bj.png”); //背景图片
pSprite->setAnchorPoint(ccp(0,0)); //设置背景的位置
pSprite->setPosition(ccp(0,0)); //设置背景的位置
addChild(pSprite);
然后添加玩家,让玩家位于左边屏幕中间,
CC_BREAK_IF(! CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)));//
//从CCLayerColor继承后,必须对它用initWithColor进行初始化
CCSize winSize = CCDirector::sharedDirector()->getWinSize();//逻辑尺寸而不是像素
CCSprite *player = CCSprite::create(“player.png”, CCRectMake(0, 0, 27, 40));
player->setPosition(ccp(player->getContentSize().width / 2,
winSize.height / 2));
this->addChild(player);
bRet = true;
} while (0);
注:getContentSize()返回的就是这个矩形的大小,只是是逻辑尺寸, 而不是像素的,例如:一个sprite都被看成是一个矩形,具有长和宽,单位是point。
接下来添加怪物,并且让怪物可以移动,我们在屏幕右边创建怪物,建立动作让它们向左移动,
思路就是随机产生怪物,这个怪物并且能自动随机移动。产生的怪物刚好是在手机屏幕的右边产生,所以怪物x的坐标就是屏幕的宽度,再加上怪物身体的一半。
monster->setPosition(ccp(winSize.width + monster->getContentSize().width / 2, actualY));
要让怪物随机的产生,只能在Y轴上做文章,所以只需要让actualY随机就行。
CCSprite *monster = CCSprite::create(“monster.png”);
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
int minY = monster->getContentSize().height / 2;//最小的Y。
int maxY = winSize.height - monster->getContentSize().height / 2;//最大的Y
int rangeY = maxY - minY;//怪物产生的有效范围
int actualY = (rand() % rangeY) + minY;//rand()%rangeY//的意思就是值为rangeY-1,在有效范围内加上最小值,也出不了那个范围
//起始点在屏幕之外
monster->setPosition(ccp(winSize.width + monster->getContentSize().width / 2, actualY));
this->addChild(monster);//显示怪物
int minDuration = 2.0;//最小时间
int maxDuration = 4.0;//最大时间
int rangeDuration = maxDuration - minDuration;//时间范围
int actualDuration = (rand() % rangeDuration) + minDuration;//时间范围-1再加最小时间
CCMoveTo *actionMove = CCMoveTo::create(actualDuration,
ccp(-monster->getContentSize().width / 2, actualY));//多少时间移动到哪里,这是一个动作,
//monster的前面是一个负号表示方向相反
CCCallFuncN *actionMoveDone = CCCallFuncN::create
(this, callfuncN_selector(HelloWorld::spriteMoveFinished));
//CcallFuncN说明spriteMoveFinished这个函数的参数将是一个节点,因为节点是管显示的,当精灵从左移到右的时候,我们需要它从屏幕上消失,即删除这个节点。
monster->runAction(CCSequence::create(actionMove, actionMoveDone, NULL));
//CCSequence是一个动作组合,将一个几秒钟移动结束的动作和一个想事动作组合在一起,就形成了移动结束后调用什么函数的功能。
接下去就是定时创建怪物,在init函数返回之前,安装定时器,每秒执行一次,代码如下:
his->schedule(schedule_selector(HelloWorld::gameLogic), 1.0);
不直接调用addMonster函数,而是调用gameLogic函数,因为后面的1.0参数,要传递给gameLogic函数的dt参数。接着让玩家可以射击子弹,当用户在屏幕点击时,就让玩家往点击的方向进行发送子弹,用户的屏幕点击点并不是子弹移动的最终地:
接下来,就是让炮塔可以旋转射击。
_player = CCSprite::create(“player2.png”);//炮塔精灵
_player->setPosition(ccp(_player->getContentSize().width / 2, winSize.height / 2));//炮塔的显示位置
this->addChild(_player); //显示炮塔
计算出炮塔的旋转角度:运用数学知识,tan(angle) = 对边 / 邻边,利用反正切angle = arctan(对边 / 邻边),这时计算出的是弧度,用CC_RADIANS_TO_DEGREES宏转换成角度。另外在数学中,逆时针为正,在Cocos2D-x中,顺时针为正,就如下图所示:
要让层可以支持触摸,需要在init方法,添加如下代码:
this->setTouchEnabled(true);
//这个函数是CCLayer类开启触屏响应功能的开关。
只是管子弹的飞行方向和速度。具体的说就是向触摸点发射出去,最终消失的位置。
在这里是不管消不消灭敌人的。消灭怪物的事,由帧去负责。帧里把这个子弹和怪兽清除了,就不会再在屏幕上出现了。
当子弹碰到怪物时,怪物被消灭,子弹消失,即碰撞检测。需要在场景中跟踪目标和子弹。
需要将最后计算出的角度乘以-1。
float angleRadians = atanf((float)offRealY / (float)offRealX);//ataf(对边/邻边)是弧度
float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);//弧度转为角度
float cocosAngle = -1 * angleDegrees;//逆时针转为顺时针方向
_player->setRotation(cocosAngle);//将炮塔的方向设置成触摸的方向
旋转再射击。炮塔的旋转是瞬间完成的,这不符合现实,需要让它有个动作移动炮塔的方向。然后就需要下面这个代码:cocos2d::CCSprite *_nextProjectile;//子弹,这个变量的设定只是起到一个中间作用。意思是,用它生成一颗子弹,然后将这颗子弹加入到子弹数组中。
(二)游戏成果图
五、研究目标与主要特色
(一)研究目标
游戏给人们紧张的生活带来了无限的乐趣,是人们生活的调味剂,总所周知,移动互联网是未来生活的主旋律,因此两者的结合,手机游戏将迎来广阔的市场,在此情况下研究手机游戏运营商如何获利具有非常重要的价值。
通过自己所学的知识基本完成系统的功能实现,在完成系统的过程中对使用cocos2d-x的了解。
(二)主要特色
Cocos2D-X是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C++Cocos2D-X-iPhone项目的版本。Cocos2D-X发展的重点是围绕Cocos2D跨平台。即其实现一次编码,在各平台分别编译后即可运行,不需为跨平台修改大量代码,不需要在这一方面花费很多时间和人力。
随着智能设备平台的普及、用户数量的增多,智能平台的应用,尤其是游戏异常火爆,从植物大战僵尸到愤怒的小鸟,移动平台游戏的开发进入了新的阶段。但是另一方面,平台的多样性也给开发者带来诸多不便,怎样将一款游戏发布到多个平台也是开发者们一直在探索的问题。特别是随着Android和iOS平台的兴起,开发者的游戏跨平台的需求更强了,随机Cocos2D-X分支诞生。其中“x”包含了两个意思:一方面是C++的文件扩展CXX,“x”表示该项目是由C++编写的;另一方面意味着交叉,这个开源项目的目的是让用户创建跨平台的代码。Cocos2d-x使用C++重写的Cocos2D-x框架,因为Android和iOS均支持C++。
因为Cocos2d-x具有跨平台的特点,再加上Cocos2d全球社区的支持,Cocos2d框架简单易学、十分容易快速上手,因为Cocos2d-x迅速成为开发者的首选。经过一段时间的发展,众多开发者使用Cocos2d-x开发出了多款游戏,包括捕鱼达人、地铁总动员等。
由于App Store的发展,很多开发者开始使用Cocos2d-iphono开发游戏并
将游戏提交到App Store上。截止2008年年底App Store就已经有数十款游戏使用Cocos2d开发。
随着智能手机平台的发展,在其他平台上的游戏开大需求也开始多了起来。此时,Cocos2d的各种平台、各种编程语言移植版也开始涌现,SinyCocos、Cocos2d-Android、CocosNet、Cocos2d-JavaScript相继诞生。
结论
纵观IT产业的发展史,计算机游戏已经成为技术创新背后的动力之一。传统的台式机游戏经目标锁定在低级趣味的人和青少年身上,而手机游戏则每个人随时随地都可以访问的到的。虽然手机游戏的价格不贵,但它的使用量是巨大的,也因此带来巨大的商业价值。它具有娱乐性和趣味性,而且它的操作简单,易于掌握,是人们日常生活中不可或缺的娱乐方式。
伴随使者3G时代的到来,手机上网逐渐普及,上网资费进一步下调,尝试使用手机进行娱乐互动的消费者越来越多,随着移动支付系统日趋成熟和盈利迷失的逐渐明朗,随着资本对于手机游戏市场的关切,随着行业内从业人员专业技术水平的不断提高,我相信中国的手机游戏产业必将会迎来一个新的发展高峰。
致谢
由衷的感谢我的导师。在论文写作的整个过程中,得到了导师从的全面指导,导师对学生认真负责的精神和高效务实的工作作风给我留下了深刻的印象。在此,谨对导师的辛勤劳动表示最为诚挚的感谢!
我学会沉下心来,去阅读,去经历。不害怕走弯路,不害怕失败,不害怕成功可能还很遥远。尽管前途茫茫,但我知道我的人生一定会很精彩。不追求荣华富贵,不追求功成名就,只追求在自己的小世界里我的脚步不会停下来。只要不后退,再慢的前进也是前进,再多的挫折也不该是我们努力的终结点。去相信,自己可以,明天会更好,你的明天才真的会更好。
衷心感谢所有关心、支持和帮助我完成学业的亲人和朋友们,是你们使我在完成学业的过程中,无论是轻松还是艰难,心里始终充满了感激和温馨!
参考文献
[1].满硕泉,Cocos2D-x权威指南,机械出版社,2013
[2].谭浩强,C程序设计(第三版),清华大学出版社,2005
[3].谭浩强,C++程序设计,清华大学出版社,2004
[4].baiyuzhong.Cocos2D家族的前世今生
[5].Sam Clegg.Cocos2D-x开发者手册.http://www.cocos2d-x.org/projects/cocos2d-x/wiki.2013
[6].维基百科,7Z.http://en.wikipedia.org/wiki/7z,2013
[7].刘剑卓, Cocos2D-X游戏开发技术精解,人民邮电出版社,2013
[8].如何使用cocos2d开发一个简单的游戏,ttp://www.cnblogs.com/zilongshanren/archive/2011/03/28/1997820.html,2011
[9].Cocos2d开发者平台,http://cn.cocos2d-x.org/,2013
[10].秦春林,我所理解的Cocos2d-x,电子工业出版社,2014
[11].火烈鸟网络科技,Cocos2d-x高级开发教程,人民邮电出版社,2013
[12].钟迪龙,Cocos2d-x游戏开发之旅,电子工业出版社,2013