版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录175481绪论 134171.1开发背景
172231.2发展趋势
213391.3研究意义
2217641.4国内外现状 387382相关知识简介 4119182.1游戏引擎简介 4292872.2Cocos2d-x开源游戏引擎简介 5241162.3Shader简介 6237282.4GLSL简介 691532.5JNI简介 7118912.6Android签名简介 7144252.7其他游戏制作辅助软件工具介绍 8326752.7.1TexturePacker(图片打包软件) 846102.7.2TiledMap(地图编辑工具软件) 973302.7.3BMFont(位图字体制作软件) 1021072.7.4ParticleDesigner(粒子系统可视化编辑软件) 11289133总体设计 1326863.1游戏总体概述 13543.2游戏运行流程 13244843.3游戏特色玩法概述 15103773.4游戏操作设计 15239313.5游戏关卡设计 15513.6游戏模块设计 16169184详细设计 17292394.1游戏运行流程 17257634.2游戏模块 1862454.2.1游戏场景 18250214.2.2主角 1817364.2.3荷叶 21183354.2.4地图 2470764.3公共管理控制模块 29104034.4高级模块部分 29164944.4.1Shader简单应用 30283924.4.2广告SDK接入 32110955系统测试 39251235.1游戏场景测试 39282625.2游戏逻辑测试 3963625.3游戏音效测试 40184875.4游戏数据测试 4063045.5游戏性能测试 4130315.6游戏广告测试 41176756结论 4324662致谢 4431607参考文献 45西南石油大学本科毕业设计(论文)基于cocos-2dx开源游戏引擎的游戏开发与设计PAGEPAGE44PAGEPAGE43绪论当今时代手机、iPad等移动设备如雨后春笋一般迅速崛起,硬件的性能更是呈现几何倍数增长,越来越多的老百姓用上了智能手机,iPad也进入了千家万户。随着手机、iPad等移动设备的普及,随着移动互联网的性能发展的越来越快速,手机游戏渐渐发达了起来,手机游戏开始逐步霸占游戏市场。人们的时间大多都花费在手机上,因为生活的节奏不断的加快,人们的有太多时间是琐碎的,比如公交车上,火车上,地铁上等等,这些琐碎的时间都将消耗在手机、iPad上,这一现象更是让手游这个行业崛起的更加迅速和稳定,也将是一个未来的趋势。随着智能手机的横空出世,手游产业也从当年的微不足道发展成如今的空前壮大,回顾手游的发展历程,它把机遇抛向无数的创业者,一批又批优秀的手游开发运营商在这个市场中开始凸现出来。如今,现代人日常生活已经离不开智能手机了,而手游也逐渐成为现代人日常生活和娱乐的一部分。手游最大的发展机遇在于用户的数量,所有使用智能手机的用户都是手游产品的目标,而且这一目标在未来只会越来越多,因此手游的市场在不断的壮大,然而具体到某一款手游产品上,情况就大有不相同了。但是对于广阔的手游市场来说,机会随时随地都在产生,这种不确定性的发展和爆发性,让所有的手游开发商都感到兴奋不已。开发背景
手游是指在手机、iPad等各类手持设备上运行的游戏类应用程序,其运行需要一定的硬件环境和相关的系统基础。从2005年开始,图形化手机游戏开始出现,种类和数量在不断激增。2005年6月,盛大和英特尔宣布携手共同开发国内手游市场,手游行业阵营和规模开始空前壮大,继盛大、北京掌讯、美通之后,网易、空中甚至腾讯等也纷纷加入其中。手游正处于起步发展时期,在接下来的两三年中,手机游戏必将进入快速发展时期。
然而随着产业的不断发展,不断有新的手游公司成立,2015年的手游市场也不能盲目乐观,手机游戏市场开始饱和,机遇与挑战并存。开发一款手游对于我来说是一个提升,对手游的理解,对手游的开发和上线的过程进行尝试,积累重要的经验和应对各种艰难的挑战的资本,为以后进入这个行业打下坚实的基础。发展趋势
近年来,随着智能机的普及以及3G、4G的新型高速网络的出现,为手机网游的兴起打下了坚实的基础,现在手机网游玩家已经不计其数。2014年,国内移动互联网竞争格局未定,运营商为了快速吞噬这块蛋糕,占有更多的自主权,转型力度、资源投入日趋加大。在部分细化领域,围绕运营商转型的业务和渠道价值骤然放大,引发产业整合日趋频繁。在此背景下,国内移动互联龙头拓维信息通过多年技术积累及运营商渠道优势,确定以手机动漫与游戏业务为两大核心发展方向之一。手游最大的发展机遇在于用户的数量,所有使用智能手机的用户都是手游产品的目标,而且这一目标在未来只会越来越多,因此手游的市场在不断的壮大,当然具体到某一款手游产品上,情况可能就大不相同了。但是对于广阔的手游市场来说,机会随时随地都在产生。研究意义
全球在使用的智能手机和移动设备已经超过20亿部,而且这个数字时时刻刻都在不断增加,并且现在,手机用户远远超过了计算机用户。手机游戏潜在的市场比其他任何平台都广,虽然和游戏控制台或者PC相比,手机可能并不是一个非常理想的游戏设备,但毕竟人们总是随时随地携带,随时随地都可以打开手机玩游戏,这样手机游戏必然成为人们消遣时间的首选。手机的便携性、移动性满足了用户随时随地玩游戏的需求,用户可以在任何无聊的时间进行游戏,比如排队、等车、坐车等等。据调查显示,30%的用户在玩手机玩游戏以后PC端玩游戏的时间减少,手机游戏的时间开始抢夺电脑游戏的时间,20%的用户玩手机游戏的时间不断加长,手机游戏已然成为人们最为普遍的娱乐方式。随着移动网络的发展,移动游戏越来越被大家所青睐。据研究表明,手机游戏业务营收是掌机的3倍。手机游戏的市场潜力巨大,而投入资金少,吸引了很多其他的市场投入,但中小型开发团队在激烈的竞争中的生存问题仍然非常严峻。手机游戏开发商和服务提供商不重视市场宣传和推广工作,忽略了用户对于游戏产品的体验和习惯培养的重要性。手机游戏市场竞争愈演愈烈,该竞争涉及到全球所有的手机游戏开发商。手机游戏开发商追求低成本和短期利益,游戏产品的质量粗糙,以及手机游戏的抄袭也越来越严重,创新力严重不足。国内外现状国内手游的质量低下,创新力度严重不足,抄袭非常严重。而国外的游戏层出不穷,无论是在质量还是创新力度都远远高于国内的市场。AppStore中的游戏和国内的各大Android市场的游戏比较,将会发现,AppStore中大多数游戏都在国内的Android市场中有他的影子,但是质量远远不足,都是抄袭而来。而且国外的手游在AppStore中收费比较规范,而国内的手游扣费很不规范,各种暗扣导致用户一不留神就被收取了费用,这也是国内游戏的质量低下而数量多的原因。追求数量多,而质量粗糙,在乎当前眼前的利益而忽视了长久的效益。国内的游戏的数量增长速率非常的恐怖,由于手游的开发非常廉价快速和容易,导致国内的手游企业迅速崛起,认为只要做出游戏就能挣钱,这也是一个非常重要的原因。由此可见,国内的手游的问题最为严重,需要各大企业重新思考,如何在市场上占有一席之地。提高游戏的质量,强调创新的重要性,这将是国内手游的发展的核心关键性问题。因此国内很多小企业、小团队如果继续原来的运作模式不依靠大公司的平台和力量,将会被淘汰,将会被那些追随市场趋势的大公司所代替。相关知识简介游戏引擎简介游戏引擎是指一些已经花费了很多精力编写好的可编辑游戏的系统或者一些交互式实时图像应用程序的具有针对性的核心组件。这些系统为游戏开发者提供了各种编写游戏所需要的各种工具组件,以便游戏开发者能容易和快速地做出游戏程序,而不用做很多重复性的工作。游戏引擎通常包含以下系统:渲染引擎、物理引擎、碰撞检测系统、音效、脚本引擎、网络引擎以及场景管理等。游戏引擎提供一系列可视化的开发工具、可重用组件以及一些预制件。这些工具通过与开发环境进行集成,方便开发者简单、快速进行以游戏逻辑为核心的游戏开发。为了提高游戏开发人员的开发效率,引擎还集成了声音、操控和网络等其他功能部件。游戏引擎可以提供灵活和重用平台,向游戏开发者提供所需要的全部核心功能,从而节省大量的游戏开发费用和开发时间,降低了开发的复杂性,缩短游戏的上市时间,并且这些要素正是所有这些对于高竞争性的游戏产业非常关键的因素。游戏引擎通常也会被要去具有跨平台的能力,游戏引擎通常会提供平台抽象层,实现同一款游戏可以在各种不同的平台上运行,平台包括游戏机、个人电脑和手机,而只需要改动少量的源代码。一般来说,游戏引擎均设计成基于组件的架构,方便进行特定子系统的替换或者添加新的引擎中间件,从而实现功能的扩展。通过组件技术,游戏引擎具有了扩展性,而扩展性无疑是游戏引擎最为重要的特性。游戏引擎有时也会应用于实时图像交互的应用,比如场景演示,建筑建造模拟,模拟训练,环境建模等等。3D引擎的渲染系统往往建立在一套高级的图像API之上,这些API通常可以操作硬件,诸如Direct3D或OpenGL,这些API封装了GPU和显卡的部分核心功能。引擎中还包含了很多其他的重要的功能模块,他们提供对其他硬件设备的独立支持,诸如输入设备(鼠标、键盘、控制杆)、网卡、声卡。在具有硬件加速能力的图形卡出现以前,开发者使用软件渲染,这种渲染效率稍微低下一点。现在软件渲染通常被用于非实时图像的渲染。一些开源游戏引擎会提供完整的源代码,其他的只提供一个经过封装的API接口,使用者用过调用DLL文件中的函数和方法来使用这个引擎。Cocos2d-x开源游戏引擎简介Cocos2d-x是一个开源的2D游戏开发框架,MIT许可证下发布的。这是一个C++Cocos2d-iPhone项目的版本。Cocos2d-X发展的重点是围绕Cocos2d跨平台,Cocos2d-x提供的框架。代码可以用C++或者Lua编写,使用API都是Cocos2d-x提供的。Cocos2d-x项目可以很轻松地建立和运行在iOS,Android,WindowsPhone等移动操作系统中。Cocos2d-x还支持Windows、Mac和Linux等PC桌面操作系统,因此,开发者可以很容易在桌面操作系统中编码和调试。Cocos2d-x是一个跨平台的2D游戏引擎,使用C++开发,基于OpenGLES,源于Cocos2d-iphone,目前支持iOS4.1,Android2.1及更高版本,WindowsXP&Windows7,WindowsPhone8.什么是“x”?C++文件命名方式:有时候,用户写的cpp文件扩展CXX.“x”,标志着该项目是由C++开发,并提供C++的API编写的。“x”,也意味着交叉。这个开源项目的目标是让用户所编写的代码具有跨平台的能力。支持的平台是在iOS,Android的,WinPhone,Win32平台上,并且平台的种类正在不断的扩大。主要功能:1.流程控制:轻松简单地管理不同场景之间的流程控制。2.精灵:快速而方便的精灵对象。3.动作:让精灵们做出不同的行为。可组合的动作如移动、旋转、缩放、消失和变色等更多。4.特效:特效包括波浪、旋转和透镜等更多。5.平面地图:支持包括矩形和六边形平面地图。6.转换:场景之间的切换。7.菜单:创建内部菜单。8.文本渲染:支持标签和HTML标签动作。9.文档:编程指南、API文档、自带的很多测试程序样例。10.MIT许可:尽管用就是了。11.基于OpenGL:支持底层硬件加速。12.3D对象:MD2模型支持。13.脚本语言:支持Lua,JavaScript语言。引擎应用:Cocos2d-x引擎在国内手机游戏中占有的市场份额超过60%,而国外使用份额则是不到30%,在AppStore排行榜的top10里面,有6个都是用使用Cocos2d-x引擎开发的。由此可见Cocos2d-x的使用率还是相当高的。Shader简介Shader:着色器。是一段能够针对3D对象进行操作、并被GPU所执行的程序。通过这些程序,程序员就能够自如的设计绝大部分想要的图形效果。在一个3D场景中,可能包含许多Shader。这些Shader中有的负责对3D对象表面进行计算处理,有的负责对3D对象的纹理进行处理,有的负责对3D对象的光照进行处理。一般根据操作对象的不同,程序被分为对顶点进行各种操作的VertexShader(顶点渲染引擎)和对像素进行各种操作的PixelShader(像素渲染引擎)。GLSL简介GLSL:OpenGL着色语言(OpenGLShadingLanguage)是用来在OpenGL中进行着色编程的语言,是开发人员写的短小的高效的自定义程序,他们将在图形卡的GPU(GraphicProcessorUnit图形处理单元)上并行执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程型。比如:投影变换、视图转换等。GLSL的着色器代码分成2个部分:VertexShader(顶点着色器)和FragmentShader(片元着色器),有时还会有GeometryShader(几何着色器)。顶点着色器负责运行顶点着色,和坐标变换。它可以得到当前OpenGL中的状态,通过易变变量和GLSL的片元着色器进行交换,通过一致变量可以使外部程序和着色器的进行数据交互。GLSL其使用C语言作为基础高阶着色语言,避免了使用汇编语言或者硬件规格语言的复杂性。JNI简介JNI。从Java1.1开始,JavaNativeInterface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行底层交互。JNI一开始是为了本地编程语言,特别是C和C++,但是它也可允许你使用其他语言,只要符合调用约定支持就可以。使用java与本地已编译的代码进行交互,通常会丧失平台的可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java虚拟机环境下。运行如图5.1JNI结构关系图。图2.1JNI结构关系图Android签名简介在Android系统中,所有被安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限。Android使用Java的数字证书相关的机制来给应用程序进行签名。Android系统要求系统中的任何一个应用程序都必须经过数字证书签名,数字证书的私钥则保存在应用开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包进行自我认证的。Android数字证书内容包含以下几个要点:1.任何一个应用程序都必须有数字证书,Android系统拒绝安装任何没有数字签名的应用程序。2.Android程序包使用的数字证书可以是自签名的,并不需要是一个权威的数字证书机构签名认证。3.如果要正式发布一个Android应用程序,必须使用一个合适的私钥生成的数字证书来给程序签名,即必须使用Android的开发工具(ADT插件和Ant)生成的发布模式的证书来签名。4.数字证书都是有有效期的,Android只是在应用程序安装的时候会检查证书的有效期。如果程序已经安装到系统当中,证书过期不会影响程序的正常功能。5.Android使用标准的java工具KeytoolandJarsigner来生成数字证书,并通过Android的开发工具(ADT插件和Ant)给应用程序包签名。6.使用zipalign优化程序。Android系统绝对不会安装运行任何一款没有数字签名的应用程序,无论是在Android模拟器上还是在真实的物理设备上。Android的开发工具(ADT插件和Ant)都可以协助开发者给应用程序进行签名,它们都有两种模式:调试模式(debugmode)和发布模式(releasemode)。其他游戏制作辅助软件工具介绍TexturePacker(图片打包软件)TexturePacker这个词从字面来说就是Texture(纹理)+Packer(打包)。它是一款把许多细碎的图片纹理拼接为一张大图的工具。运行截图如图2.2TexturePacker运行截图。功能:在OpenGL载入图片纹理的时候,为了绘制效率会将的图片纹理的内存自动对其或者扩张到2的n次方。例如,如果你的资源素材是9×17px,那么将会按16×32规格载入纹理图片。如果图片纹理是129×64,那么就会按照256×64载入了。因此这些情况将会浪费极大的内存空间,然而移动设备上的游戏,内存是非常珍贵的。理论上,如果每一张纹理图片的长宽都恰好是2的n次方,那就非常完美了,就没有任何浪费了。但是,在开发过程中这几乎是不可能的。因此我们需要把很多小图拼接到一张大图里,比如(4096×4096)然后到代码中去取需要的纹理就可以了。这样,就可以减少内存浪费。TexturePacker的优点:1.TexturePacker有windows版。2.TexturePacker有免费版。(TexturePacker对于普通开发足够用了)。3.TexturePacker支持pvr格式。4.TexturePacker支持命令行集成。图2.2TexturePacker运行截图TiledMap(地图编辑工具软件)从字面上看就是瓦块地图,他是一款将地图像瓦块一块一块填充编辑然后供游戏使用的工具。功能:大家都知道游戏的地图一般都是很大很复杂的,为了简化游戏的开发,将地图的编辑分离出来这就是TiledMap的功能,他可以将美术画的一些基本物件原件的图片像瓦块一样的拼起来,组成一个地图,供游戏里面直接使用,非常方便灵活。运行截图如图2.3TiledMap运行截图。优点:1.和Cocos2d-x引擎兼容性非常好。2.支持对象属性。3.操作非常方便,支持多选,克隆等操作。图2.3TiledMap运行截图BMFont(位图字体制作软件)从字面上看,BM代表位图,Font代表字体,就是制作位图字体的软件工具,可以将字体图片和对应的字符映射起来。运行截图如图2.4BMFont运行截图。功能:游戏中的字体都是非常有个性的,并不像系统字体那么常见和通用,所以制作一款符合游戏风格的字体的制作就先的很重要了,BMFont可以将一组尺寸一样的图片和对应的字符集映射,从而产生一个字体,供游戏中使用。优点:1.BMFont非常小,功能却很全面。2.BMFont和Cocos2d-x游戏引擎兼容非常好。图2.4BMFont运行截图ParticleDesigner(粒子系统可视化编辑软件)从字面上看,是粒子设计者,他是专门用来可视化编辑粒子系统的软件,可以直观的看到参数对应的具体效果。运行截图如图2.5ParticleDesigner运行截图。功能:游戏中的有粒子系统功能模块,但是粒子系统的参数十分复杂,并且都是数字,无法直观的看到粒子系统的效果。因此粒子系统可视化编辑软件便应运而生了,ParticleDesigner正是专门用来将这些数字对应的效果显示出来,并且可以动态的调试效果,而且可以导出cocos2d-x使用的plist格式的配置文件,供程序中直接使用。优点:1.ParticleDesigner非常小,功能也算齐全。2.ParticleDesigner本身也是使用cocos2d-x开发的一款开源软件,并且在github上有开源项目,可以下载下来直接使用,甚至还可以自己修改代码,生成各种平台的可执行程序。图2.5ParticleDesigner运行截图总体设计游戏总体概述本游戏为迷宫益智型小游戏。在一幅铺满荷叶的池塘中,每个荷叶都是垫脚石,主角必须踩在荷叶上朝着终点行走。主角只能站立在一片荷叶上,并且向其他荷叶进行移动,荷叶有五种不同的形状和两种颜色,每种形状有不同的方向指向,只有两片荷叶的指向相通时才可以向该荷叶进行移动,否则不可移动,并且每移动到一片荷叶上,这片荷叶将会发生旋转,改变他的指向。颜色不同的两种荷叶的旋转方向是相反的,这样使得更具有挑战性。如果主角进入的那片荷叶没有相通的荷叶,那么游戏以失败结束。如果主角到达目标终点,那么游戏以胜利结束,并且会记录行走的步骤,供再现模式展示使用。参见图3.1游戏场运行流程图和图3.2游戏场景示意图。游戏运行流程游戏的运行流程,如图3.1游戏运行流程图。游戏开始进入选关场景,可以选择游戏模式和再现模式,然后选择关卡后,进入游戏场景进行游戏或者重现游戏,游戏过程中可以重新开始本关卡或者返回选关场景。在游戏进行中,游戏成功或者失败都将返回选关场景进行重新选择关卡进行游戏,在选关场景可以还选择退出游戏。重现游戏重现游戏重新开始游戏胜利、失败、返回进行游戏游戏开始选关场景游戏场景游戏结束图3.SEQ图\*ARABIC\s11游戏运行流程图图3.2游戏场景示意图游戏特色玩法概述1.游戏中的荷叶分为两种,绿色和紫色,绿色的荷叶旋转方向为逆时针方向,而紫色为顺时针方向,因此在要进行移动的时候需要考虑他的转向,而判断是否对游戏的顺利进行有利,更具有挑战性。2.开始部分的关卡的荷叶总体数量较少,并且荷叶颜色基本为绿色,越往后面紫色越多,并且荷叶总量也越多,距离终点的路程也越长,最后两种颜色的荷叶数量相持平,使得游戏的难度逐步加大,玩法过程更加有趣。3.游戏会记录成功走法的步骤,如果下次以更少的步骤通关,将会用新的步骤数据覆盖原来的步骤数据,通关的关卡下方将会显示最佳记录步数,并且可以重现该记录给玩家观看。4.提示小贴士,在每次进入游戏场景的时候显示游戏帮助提示标签,游戏帮助标签的内容在帮助文本数据中进行随机选择。5.数据异常处理,关卡通关记录的数据如果被恶意篡改也不会导致游戏崩溃,他会将正确的数据进行再现,直到主角走到数据错误的位置时候才会提示错误并且返回选关场景。这样就不会让有用的数据因为一点点的其他错误而无法展示了。6.游戏可以放大场景,随意拖动场景,即使是在再现模式也可以放大场景以及随意拖动场景,以便玩家直接计算将来要走的所有步骤。7.每次进入游戏场景播放的音乐都是从音乐库中随机选取,将会使得游戏更加有趣。游戏操作设计1.玩家通过点击屏幕上主角的周围可通过的荷叶进行移动,如果点击其他地方,将会有错误提示信息。2.一根手指在屏幕滑动的时候可以拖动场景,查看整个场景的布局,直到将场景脱出可视区域。3.两根手指同时滑动可以放大和缩小游戏场景,缩放到最小的时候几乎可以看见整个地图的全貌,缩放到最大的比例为2.5倍。游戏关卡设计1.第一关设计为教学关卡,布局非常简单,让玩家可以非常容易轻松的过关并且了解玩法和操作的要领,从第二关开始为正常的关卡。2.保证每个关卡必须有解,使用TiledMap手动拖放荷叶对象,并且进行严格测试,在保证有解的情况下仍然更加有趣。3.难度设计,关卡越往后越难,难度由荷叶的数量,和颜色的比例,以及距离终点的距离,以及具有欺骗性的布局的数量进行调整。游戏模块设计1.主角模块:玩家主要操作的对象,也是游戏最重要的表现形式之一,也是玩家最为频繁接触的对象。主角要对玩家的操作进行反应和反馈,当玩家点击可以走向的荷叶时,主角需要向那个荷叶进行行走,如果主角正在行走过程中,那么将不能对主角进行移动操作,如果要行走的目标方向不合法,要弹出错误提示。2.荷叶模块:荷叶对象是游戏场景中占得面积最大的一块,所以也是游戏的主要表现形式。荷叶将对主角的行为作出反应,当主角走入荷叶时,荷叶进行相应的旋转,绿色逆时针旋转,紫色顺时针旋转,当主角走入终点荷叶时游戏胜利。3.地图模块:所有的荷叶以及主角都在地图上,地图保存着荷叶的所有荷叶的数据,包括荷叶的种类,转向,等等,并且包含了主角的起始位置,目标终点位置。4.公共管理控制模块:主要是一些常用的方法和管理器,管理器包括动画管理器,音效管理器,以及数据管理。本模块在游戏中占有非常重要的地位,其他所有模块都有可能会用到这个模块的内容。详细设计游戏运行流程游戏场景的运行流程图,游戏开始时玩家点击屏幕进行操作主角,如果点击的是非荷叶的部分,那么提示无效,如果点击的是荷叶,则判断是否可以到达此荷叶,如果不可以到达那么弹出错误提示,如果点击的荷叶可以到达,那么主角移动到此荷叶,并且此荷叶进行相应的旋转,并且判断这个荷叶是否是终点,如果是终点则游戏胜利,否则判断是否有可以去的荷叶,如果有则不进行任何操作等待玩家的下一次点击操作,如果没有则游戏失败。如图4.1游戏场景运行流程图。开始开始玩家点击玩家点击点击可到达荷叶?否提示无效点击可到达荷叶?否提示无效是是主角移动到该荷叶,旋转荷叶主角移动到该荷叶,旋转荷叶是游戏胜利荷叶为终点?是游戏胜利荷叶为终点?否否否是否是游戏失败可以到达其他荷叶?游戏失败可以到达其他荷叶?结束结束图4.SEQ图\*ARABIC\s11游戏场景运行流程图游戏模块游戏场景1.游戏开始场景:游戏开始场景最为简单,只是展示游戏的标题名称,和游戏的风格,并给出开始游戏按钮。2.游戏选关场景:本场景列出所有的关卡,供玩家选择进行游戏的模式和关卡,点击关卡按钮便可进行游戏,本场景有退出游戏按钮,只有这里可以进行退出游戏操作。3.游戏场景:核心场景,玩家进行游戏的场景,操作主角进行移动向终点行走。主角主角类的设计,是游戏的核心模块之一,由玩家操作他,让他按照玩家的操作做出不同的反应,是游戏的主要表现的对象。主角使用序列帧动画,所用的图片纹理如图4.2主角序列帧动画纹理图集。图4.2主角序列帧动画纹理图集主角继承自cocos2d-x的Node类,并且添加很多额外的属性:移动动作是否完成,当前所在荷叶,可以去的荷叶等等。主要代码如下:classHero:publiccocos2d::Node{private: boolmovActionIsDone;//移动动作是否完成 Lotus*currentLotus;//当前所在荷叶 Lotus*canToLotus[4];//可以去的荷叶 unsignedcurrentStep;//当前步数 cocos2d::Sprite*errorlabel;//错误标签public: LevelDatalevelData;//步骤数据 TiledMap*map;//地图 floatstepSize;//步距 cocos2d::Sprite*hero;//主角精灵……主角的核心方法如下:1.初始化方法(init):在某个关卡的地图上初始化主角,包括初始化主角的位置,主角的所有属性,以及最重要的步骤数据。核心代码如下:boolHero::init(TiledMap*&m,unsignedintlevel){//初始化属性数据 this->addChild(hero); map=m; map->tiledMap->addChild(this,5); stepSize=map->tiledMap->getTileSize().width; hero->setAnchorPoint(map->getHeroAnchorPos()); hero->setPosition(map->getHeroPos()); currentLotus=map->getLotus(hero->getPosition()); findCantoLotus();//查找所有可以去的荷叶…… if(PLAY_STATUS==Breakthrough) {//初始化步骤数据 levelData.step4s=(StepDir*)::operator new(sizeof(StepDir)*MAX_STEP_SIZE_4); }……2.移动方法(move):使主角在荷叶间移动包括4个方向上下左右,并且在移动之前需要判断这次的移动是否合法,如果已经在移动的状态下是不可以进行移动的。核心代码如下:voidHero::move(AnimationKeydir){ if(!movActionIsDone)return; CCPointmoveByPosition; switch(dir) { caseaDown: moveByPosition=ccp(0.0f,-stepSize);break; caseaLeft: moveByPosition=ccp(-stepSize,0.0f);break;…… } CCAnimate*animate=CCAnimate::create(AnimationManager::getAnimation(dir));…… hero->runAction(movAction);}3.自动移动方法(autoMove):实现关卡再现的功能,让主角按照关卡数据自动移动。每次行走读取一次步骤数据,然后行走,并且在行走完成后添加回调,回调函数为本函数进行迭代,每一次行走都会检查是否正确,如果不正确那么意味着步骤数据异常,弹出错误提示,删除本关错误的步骤数据,并且返回选关关卡。核心代码如下:voidHero::autoMove(){ if(!movActionIsDone)return; currentStep++; AnimationKeydir=getlevelDataDir(currentStep,levelData);//获取步骤数据 CCPointmoveByPosition; switch(dir) { caseaDown: moveByPosition=ccp(0.0f,-stepSize); break; ……} CCAnimate*animate= CCAnimate::create(AnimationManager::getAnimation(dir));……//回调函数中再调用自己 CCCallFuncND::create(this,callfuncND_selector(Hero::autoMoveCallBack),(void*)false),spawnAct,CCCallFuncND::create(this,callfuncND_selector(Hero::autoMoveCallBack),(void*)true),NULL); hero->runAction(movAction);}荷叶荷叶类设计,是游戏的核心模块之一,是游戏中荷叶对象的展示以及和主角进行功能交互和反馈,主要包括主角进入后的旋转,和对数据的体现。荷叶使用的图片纹理如图4.3荷叶纹理图集。图4.3荷叶纹理图集荷叶继承自cocos2d-x的Node类,并且添加很多额外的属性:旋转动作是否完成,当前坐标位置,荷花属性等等。核心代码如下:classLotus:publiccocos2d::Node{private: boolrotIsDone;//旋转是否完成public: cocos2d::Pointpos;//位置 LotusSprite*lotus;//图像精灵 unsignedcharlotusType;//荷花类型1-5 unsignedcharrotStatus;//当前旋转状态0-3 GotoDirgotoDir;//可以走的通的方向4 unsignedcharrotType;//旋转方向0为逆时针 unsignedcharisVictory;//是否是胜利荷花即终点 ……核心方法:1.构造函数(Lotus):主要初始化荷叶所必须的核心数据,以及根据数据初始化位置以及转向和对纹理进行选择性加载和创建。核心代码如下:Lotus::Lotus(Pointp,unsignedcharlt,unsignedcharrs,unsignedcharv,unsignedcharrotTp):pos(p),lotusType(lt),isVictory(v),rotType(rotTp){ CCString*lotusName; if(rotTp==0) { lotusName=CCString::createWithFormat("Lotus_%d.png",lt); }else { lotusName=CCString::createWithFormat("Lotus1_%d.png",lt); }Autosf=CCSpriteFrameCache::getInstance()->getSpriteFrameByName(lotusName->getCString()); lotus=LotusSprite::createWithSpriteFrame(sf); lotus->setAnchorPoint(ccp(0.5f,0.5f)); lotus->setPosition(p); rotIsDone=true; rotStatus=0; isbeDir=aNull; rot(rs);}2.旋转方法(rot):让荷叶进行旋转的方法,外部进行调用即可按照默认的属性进行正确的旋转,并且提供扩展的方法,可以强制改变旋转的次数和方向。如果已经在旋转的状态下,则不进行旋转。核心代码如下:voidLotus::rot(unsignedcharn,booldir){//默认逆时针方向旋转 if(!rotIsDone)return; floatangle=0; if(rotType==0) { rotStatus=(rotStatus+n)%4; angle=-90.0f; } else { rotStatus=(4+rotStatus-n)%4; angle=90.0f; } if(!dir) {//程序强制指定方向 rotStatus=(rotStatus-n)%4; angle=90.0f; } CCRotateBy*rotareBy=CCRotateBy::create(ROT_SPEED,n*angle); cocos2d::CCAction*rotAction=CCSequence::create( CCCallFuncND::create(this,callfuncND_selector(Lotus::rotActionIsDoneCallBack),…… lotus->runAction(rotAction); …… 地图地图模块,游戏的核心模块之一,地图作为游戏场景的主要表现方式,并且承载了荷叶和主角对象,每一个关卡的关卡数据都由地图保存着,关卡的数据包括主角的起始位置和目标终点的位置,背景纹理样式,所有荷叶对象的位置信息、种类信息以及旋转朝向信息。1.地图的配置说明:地图使用TiledMap设计地图。主要设计荷叶的铺设位置,和设置主角起点位置和终点位置。1.两个图层:(1)物件层:放置物件,目前只有一个物件胜利标示。(2)背景层:放置背景瓦块图片。2.两个对象层:(1)主角对象层:放置主角出场的位置,即起点位置对象。(2)荷叶对象层:放置荷叶对象。参见图4.4地图层示意图。图4.4地图层示意图铺设荷叶对象,目标终点物件和对象,主角起点对象。如图4.5地图铺设示意图以及属性设置示意图。图4.5地图铺设以及属性设置示意图在游戏中读取TiledMap导出的配置文件,获取所有的对象,并获取对象类型,对象的位置属性,旋转属性等等,从而创建出TiledMap描述的所有对象,并放置在对应的位置。2.地图类的设计,是游戏的核心模块之一,地图包含了所有的荷叶信息以及主角的起始位置,目标终点位置,在实例化的时候需要把所有的荷叶也实例化出来并且按照他的位置添加到地图上,还有主角和终点摆放的位置。地图类没有继承自任何类,是一个独立的类,有很多的属性:原生TiledMap对象,以及主角,荷叶容器等等。核心代码如下:classTiledMap{private: cocos2d::PointHeroAnchorPos; cocos2d::PointHeroPos;public: cocos2d::TMXTiledMap*tiledMap; cocos2d::Vector<Lotus*>lotus; floatminScale; cocos2d::Pointpos; cocos2d::PointminPos;……地图类有一些重要的方法:1.初始化方法(init):用来初始化地图的所有核心数据,创建所有的荷叶并且放到合适的位置,摆放主角的位置,等等。核心代码如下:传入地图的索引即关卡,然后通过关卡的编号来加载对应的地图:boolTiledMap::init(intmapIndex){ SizevisibleSize=Director::getInstance()->getVisibleSize(); CCASSERT(mapIndex<=MAP_SIZE&&mapIndex>0,"Invalid mapIndex!"); CCString*mapName=CCString::createWithFormat("Map/map_%d.tmx",mapIndex); tiledMap=TMXTiledMap::create(mapName->getCString());……地图可以进行缩放,但是缩放的最小比例是让地图的最小边和屏幕的最小边相等,因此缩放的最小比例是通过地图的原有尺寸的最小边计算得出的。…… floatsx=visibleSize.width/(tiledMap->getMapSize().width*tiledMap->getTileSize().width); floatsy=visibleSize.height/(tiledMap->getMapSize().height*tiledMap->getTileSize().height); minScale=sx>sy?sx:sy;……获取所有的荷叶对象数据进行荷叶的创建以及把它们添加到地图类中的荷叶容器中,供后面方便使用。把主角的数据读出来并且创建在正确的位置上。…… floatTILE_SIZE=(tiledMap->getTileSize().width); autoobjGroups=tiledMap->getObjectGroup("Lotus"); autoobjs=objGroups->getObjects(); CCASSERT(objs.size()>0,"notfindlotusinLotusGroupfromTiledMap!"); for(auto&obj:objs) { ValueMap&dict=obj.asValueMap();floatx=dict["x"].asFloat()+TILE_SIZE/2.0f;floaty=dict["y"].asFloat()+TILE_SIZE/2.0f;floatwidth=dict["width"].asFloat();floatheight=dict["height"].asFloat(); unsignedcharlt=dict["lotusType"].asByte(); unsignedcharrs=dict["rotStatus"].asByte(); //读不出来为0 unsignedcharisVictory=dict["victory"].asByte(); unsignedcharrotTp=dict["rotType"].asByte(); lotus.pushBack(newLotus(ccp(x,y),lt,rs,isVictory,rotTp)); } autoHeroObjGroups=tiledMap->getObjectGroup("Hero"); autoHeroObjs=HeroObjGroups->getObjects();……2.缩放更新方法(scaleUpdate):对地图的缩放进行更新,并且更新所有的荷叶缩放和主角的缩放,以保证场景的所有东西的缩放一致。核心代码如下:voidTiledMap::scaleUpdate(){ SizevisibleSize=Director::getInstance()->getVisibleSize(); tiledMap->setScaleX(SCALE_FACTOR); tiledMap->setScaleY(SCALE_FACTOR); minPos.x=(visibleSize.width-(tiledMap->getMapSize().width*SCALE_FACTOR*tiledMap->getTileSize().width)); minPos.y=(visibleSize.height-(tiledMap->getMapSize().height*SCALE_FACTOR*tiledMap->getTileSize().height));}3.坐标转化方法(positionToTileCoord和positionToCocosCoord):用来进行cocos2d的坐标和TiledMap的坐标转化,是对其他很多需要的地方提供方便的接口例如游戏场景的触摸事件传入的坐标是cocos2d的坐标,需要映射到TiledMap的坐标系中。核心代码如下:CCPointTiledMap::positionToTileCoord(cocos2d::CCPointcocosCoord){ floatTILE_SIZE=(tiledMap->getTileSize().width); intx=(cocosCoord.x)/TILE_SIZE; inty=((tiledMap->getMapSize().height-1.0f)-int((cocosCoord.y)/TILE_SIZE)); returnccp(x,y);}CCPointTiledMap::positionToCocosCoord(cocos2d::CCPointtileCoord){ floatTILE_SIZE=(tiledMap->getTileSize().width); floatx=tileCoord.x*TILE_SIZE+TILE_SIZE/2.0f; floaty=((tiledMap->getMapSize().height-1.0f)-tileCoord.y)*TILE_SIZE+TILE_SIZE/2.0f; returnccp(x,y);}公共管理控制模块1.动画管理器:用来预加载游戏的动画资源并且建立缓存,使得游戏能够流畅的运行,并且在统一的的动画管理器的管理下,动画的创建以及获取将会非常的方便和快捷。2.音效管理器:用来预加载音效的资源,并且建立缓存,使得游戏的的音效播放能够流畅的进行,并且不会拖慢游戏的运行。在音效的统一管理之下,播放一个音效将会非常方便和快捷。3.其他公共全局函数:提供常用的随机数函数,背景特效函数,以及提示标签函数等等。这些函数可以在其他任何文件无任何依赖的使用,非常方便和快捷。高级模块部分简单的使用一些当前比较前沿的技术在游戏中进行实践和应用,扩展游戏的功能以及让这样的小游戏更加炫酷,使得他的特效品质提升一个档次。这里使用的技术有Shader和广告SDK。Shader简单应用Shader处理荷叶,为了让荷叶看起来更加炫酷,这里为荷叶专门进行后期着色处理。荷叶看起来很难看如图4.6荷叶纹理图,荷叶中的黑色纹路很不雅观。图4.6荷叶纹理图为此,可以使用Shader对荷叶进行着色处理,使得荷叶中的黑色纹路的颜色进行不断的变化。由于荷叶纹理中的纹路都是黑色的并且不透明,所以可以借助这一点来编写GLSL的片元着色器。首先通过顶点着色器传入的纹理坐标将纹理的颜色取出,判断是否是不透明的并且是黑色的,如果是那么就进行颜色处理,使用时间的一致变量对红色以及绿色通道进行微调影响,这样就可以使得黑色纹理的颜色随着时间的变化而改变颜色了。GLSL片元着色器代码:#ifdefGL_ESprecisionmediumpfloat;#endifvaryingvec4v_fragmentColor;varyingvec2v_texCoord;voidmain(){ vec4finalColor=texture2D(CC_Texture0,v_texCoord); if( finalColor.a>.2&& finalColor.r+finalColor.g+finalColor.b<.9 ) {//blackpart finalColor=vec4( sin(CC_Time.x*1.3521), cos(CC_Time.y/1.6278), 0.24157, 1. ); }gl_FragColor=finalColor;}在cocos2d-x中应用:将本段代码应用到荷叶对象的纹理渲染中即可产生荷叶纹理中黑色部分将会随着时间不断的变化颜色。创建一个新的类型LotusSprite,使之继承自cocos2d-x的Sprite类型,然后在初始化的时候将他的shader绑定替换为自己的着色器,由于这个着色器被频繁使用,我们将这个着色器进行缓存,在LotusSprite初始化的时候取出来绑定即可。核心代码如下:classLotusSprite:publicSprite……boolLotusSprite::initShader(){ autoprogram=ShaderCache::getInstance()->getGLProgram("Lotus"); program->updateUniforms(); this->setGLProgram(program); CHECK_GL_ERROR_DEBUG();……着色器需要在缓存之前执行初始化、编译、链接,然后放入map中使用键值对进行缓存,之后通过键值对取出由于已经提前预先编译链接了,所以后面的使用将会非常迅速。着色器的缓存代码如下: GLchar*fragSource=(GLchar*)String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename("shader/Lotus.fsh").c_str())->getCString();autoprogram=newGLProgram();program->autorelease();program->initWithByteArrays(ccPositionTextureColor_noMVP_vert,fragSource);program->link();ShaderCache::getInstance()->addGLProgram(program,"Lotus");…… 广告SDK接入为了让游戏获取收益,将会为游戏进行广告的SDK接入,SDK有很多种广告平台和系统平台,我们这里使用百度的广告在芒果SDK的android平台进行上线。1.上线将程序发布到百度开发者平台上,首先需要注册一个百度开发者账号,然后将应用程序提交到平台的官网去进行验收,验收时需要准备许多资料,包括应用的图标、应用的运行截图、应用的分类、应用的语言类型、应用的描述和简介。如果通过验收成功后将会得到一个应用程序ID或者Key,有了这个ID或者Key,就可以进行广告的接入了。如图4.7上线申请示意图。图4.7上线申请示意图2.广告的接入当你的应用在某个平台通过上线申请后,将会获取你的App对应这个平台的AppKey,然后就可以使用这个AppKey接入该平台的广告了。(1)首先下载该广告平台的SDK。需要到这个平台的官网,下载最新版本的SDK,SDK一般包含三个平台,分别是IOSSDK、Unity3D、Cocos2d-x。这里我们需要下载Cocos2d-x的平台对应的SDK,如图4.8SDK下载示意图。图4.8SDK下载示意图(2)查看SDK接入文档,按照文档提示进行操作。帮助文档有很多个,包括插屏广告、横幅广告、开屏广告等等,我们只选择我们要进行接入的广告帮助文档进行配置即可。帮助文档示意图如图4.9SDK帮助文档示意图。然后我们按照文档中的说明来修改android工程的配置,将SDK的jar包引入android工程,对android工程的Manifest文件进行修改,将包名替换为我们应用的包名、添加用户权限、注册一些服务、修改应用的入口为广告的SDK入口。图4.9SDK帮助文档示意图(3)修改游戏工程源码,添加SDK广告接口。Android工程的核心代码:……//填写本app在百度的AppKeyAdsMogoInterstitialManager.setDefaultInitAppKey("520155a9e8ab4ca59993c191611284f8");AdsMogoInterstitialManager.setInitActivity(AdsMogoCoCos2dx.this);AdsMogoInterstitialManager.shareInstance().initDefaultInterstitial();……Cocos2d-x工程class中的C++代码需要对应android端的函数进行JNI调用,JNI在cocos2d-x中有一个组件JniHelper可以方便的使用。这里的接口都是针对android端设计的,所以这里的一切代码都需要加上android平台的预编译宏。广告类的头文件,声明C++中的方法,方法和android工程中的方法一致,这里都使用的是比较方便和简单的静态函数。对应的C++代码如下:#include"cocos2d.h"usingnamespacecocos2d;#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)#include<jni.h>#include"platform/android/jni/JniHelper.h"#include<android/log.h>#endifclassMOGOAd{public: MOGOAd(); virtual~MOGOAd(); staticvoidshowBanner(); staticvoidhideBanner();……广告类的实现文件,仍然使用预编译宏来针对平台编译,然后使用JniHelper来调用android工程中的java方法。对应的C++代码如下:……voidMOGOAd::showBanner(){#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) JniMethodInfoshowBanner; boolisHave=JniHelper::getStaticMethodInfo(showBanner,"org/cocos2dx/cpp/AdsMogoCoCos2dx","showBannerStatic","()V"); if(!isHave){ CCLog("jni:showBannerStaticfalse"); }else{ showBanner.env->CallStaticVoidMethod(showBanner.classID,showBanner.methodID); }#endif}……至此,可以将MOGOAd类的广告展示接口放到游戏应用程序中,自行管理什么时候或者什么情况下展示什么广告。比如在游戏开始界面显示横幅广告,在选关场景显示插屏广告。如图4.10横幅广告示意图和图4.11插屏广告示意图。图4.10横幅广告示意图由于插屏广告面积巨大,甚至偶尔占满整个屏幕(如图4.11插屏广告示意图),为了避免引起玩家的反感,所以需要限制他显示的概率和次数。一般的广告SDK的插屏广告都是设置每三次请求才会有一次请求会成功展示广告。图4.11插屏广告示意图系统测试由于游戏的测试不像网站或者其他的应用软件的测试,没有数据的输入,需要大量的真实操作,即使用黑盒测试对游戏的每个角落进行访问和各种操作。首先需要在PC端进行实现,然后在android端进行测试,最终以android端结果为准。测试将按照模块以及功能分块进行。测试的细节非常多,很容易疏漏。游戏场景测试检测游戏中每个场景的视觉上效果是否正确和是否合适。场景的错误比较明显,在视觉上可以直观的看到容易排查。1.运行每一个场景,确保没有任何图片资源的缺失,因为图片资源的缺失将会导致游戏直接崩溃。2.查看没个场景和关卡的图片资源的位置,大小,缩放,都是否正确,避免摆放位置偏离,缩放被拉伸,大小不合适等等情况。3.测试每个场景间的切换是否会冲突,每个按钮的点击是否会正确响应,状态显示是否正确。测试结果如表5.1场景测试结果。表5.1场景测试结果编号场景界面及状态按钮重要程度1游戏开始场景正确显示正确响应一般2选关场景正确显示正确响应非常重要3游戏场景正确显示正确响应非常重要游戏逻辑测试检测游戏的运行的逻辑是否和预期的结果对应。逻辑的错误常常比较隐晦,必须多次和反复的测试。1.多次点击按钮,应当只响应第一次。2.快速拖动屏幕,应当正确流畅的响应。3.多根手指拖动屏幕,应当和单指拖动一致。4.同时快速点击不同的对象,应当只响应一个地方。5.滑动时点击,应当无效。测试结果如表5.2游戏逻辑测试结果。表5.2游戏逻辑测试结果编号场景多次点击多指拖动快速拖动同时点击滑动点击重要程度1游戏开始场景正确正确正确正确正确一般2选关场景正确正确正确正确正确非常重要3游戏场景正确正确正确正确正确非常重要游戏音效测试主要检测音乐和音效是否正确以及正常播放,由于音效的播放失败将不会引起游戏崩溃,只是没有进行任何操作,所以音效的问题比较隐晦,值得注意。1.测试每一关的背景音乐是否正确。2.检测各个动作的音效是否正确。3.检测各个动作连续使用时音效是否正确混合或过渡。测试结果如表5.3游戏音效测试结果。表5.3游戏音效测试结果编号场景背景音乐音效重要程度1游戏开始场景正确正确一般2选关场景正确正确非常重要3游戏场景正确正确非常重要游戏数据测试主要检测游戏
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司财务报销制度及流程1
- 医院出纳年度工作总结范文
- 参与家乡文化建设建议书范文(7篇)
- 体育会展业的供应链优化研究-洞察分析
- 微生物污染控制-第1篇-洞察分析
- 元宇宙艺术创作研究-洞察分析
- 游戏设计专业课程改革探索-洞察分析
- 虚拟现实技术在木材加工工艺分析中的应用-洞察分析
- 移动支付安全技术-洞察分析
- 微波背景辐射探测-洞察分析
- 《韩国的语言》课后答案
- 宠物医疗创新创业
- 报价单(产品报价单)
- 一种基于STM32的智能门锁系统的设计-毕业论文
- 项目经理及主要管理人员能力水平
- 工程伦理-工程案例分析
- 缆车合唱钢琴伴奏谱
- 小学四年级上册数学集体备课-记录
- 前列腺增生课件
- 北京市2022-2023学年三年级上学期语文期末试卷(含答案)
- 《国家心力衰竭指南 2023》解读
评论
0/150
提交评论