基于cocos2d-x的RPG游戏的设计与实现毕业论文
2022-01-27 15:56:45
论文总字数:31133字
摘 要
随着智能手机的普及,国内游戏业界也开始不同于之前十年的速度快速发展起来,越来越多的游戏进入市场。游戏是一门综合性的艺术,游戏软件也是计算机工程发展过来中的一个重要的分支。游戏编程不仅仅是计算机学科的工作,其也与很多其它学科有交集,如物理学,数学等。游戏是个大的概念,具体的游戏种类分类有很多条分支,本文将从回合制角色扮演类游戏(RPG)出发,通过设计实现一款RPG游戏来论述一个游戏的大致开发流程,了解游戏编程中的一些注意点。
本次游戏开发用C 语言编程开发,游戏引擎采用cocos2d-x引擎,编译环境和平台分别是win7系统和Visual Studio 2012。游戏场景界面制作使用Tiled Map Editor软件,数据存储方面使用Sqlite3轻型关系数据库。游戏的设计和经典RPG游戏类似,采用自由角色地图移动(控制方式跨平台),随机地雷式遇敌,回合制战斗模式,功能还包括玩家角色基本信息的查看与装备道具的操作,角色的对话系统以及一些场景事件的驱动。同时游戏采用跨平台引擎开发,最后可以部署到多个平台(安卓,苹果,win)。游戏的资源替换也相当方便,可以便捷地实现游戏资源文件的升级更新。
关键词: 游戏 cocos2d 角色扮演类游戏 物理引擎 寻路算法
Design of RPG game based on cocos2d-x
Abstract
With the popularity of smart phones, the domestic game industry has begun to develop rapidly from the previous ten years. More and more games are entering the market. Game is a comprehensive art, and game software is also an important branch of computer engineering development. Game programming is not just the work of computer science, but also interacts with many other disciplines, such as physics, mathematics, etc. The game is a big concept. The specific category of the game category has many branches. This article will start from the round of role playing game (RPG), and then discuss the general development process of a game through the design and implementation of a RPG game, and understand some points of attention in game programming.
The game in this paper is developed with C language and uses the cocos2d-x engine as the game engine. The compiling environment and platform are win7 system and Visual Studio 2012 respectively. The Tiled Map Editor software is used when making the game scene interface, and Sqlite3 is used in data storage. Similar to the classic RPG game, the game is applied with free role map movement (control mode cross platform), random landmine type encounter, turn based combat mode, player role basic information view and equipment props operation, role dialogue system and a number of scene events drive. At the same time, the game can be deployed to multiple platforms (Android, apple, win) because of the cross platform engine development. The replacement of game resources is also quite convenient. It can simply upgrade and update the game resource files.
Key words: Game;cocos2d;Role playing game;Physical engine;Path finding algorithm
目 录
摘 要 I
Abstract II
第一章 绪论 1
1.1 RPG类游戏的研究背景 1
1.2开发RPG游戏的意义 1
1.3 本次毕业设计章节的组成 2
第二章 开发工具和技术介绍 3
2.1 Visual Studio 2012 3
2.2 Tiled Map Editor 3
2.3 cocos2d-x引擎 3
2.4 sqlite3数据库 4
第三章 游戏开发算法介绍 5
3.1 A*寻路算法概述 5
3.2可预测随机数 6
3.3脚本化控制流 7
3.4 AI设计 7
第四章 游戏的具体设计与实现 9
4.1系统功能模块设计 9
4.2基础工具类 10
4.3场景构建、菜单层和控制 12
4.4数据库设计 19
4.5 游戏的开始与保存 24
4.6 战斗系统的实现 27
第五章 总结与展望 32
致谢 34
绪论
1.1 RPG类游戏的研究背景
角色扮演游戏(Role-Playing Game),简称RPG,是一种玩家体验角色的游戏。玩家在游戏中需要在一个假象的虚拟世界中扮演一个或多个角色,体验所扮演角色的特性与能力,并在玩家的操控下在一个特定的规则下通过一些行动指令推动剧情的发展。玩家在游戏过程中的成功与失败取决于一个事先约定好的系统(Formal system)。这个系统是有很多规则组成的,这些规则限制了玩家的行动。
角色扮演类游戏的种类有很多。策略类角色扮演游戏(Strategy Role-Playing Game),桌面角色扮演游戏(Tabletop Role-Playing Game),动作角色扮演游戏(Action Role-Playing Game),实演角色扮演游戏(Live Action Role-Playing Games),大型多人在线角色扮演游戏(Massive Multiplayer Online Role-PlayingGame)等。这些游戏的玩法和操作可能都不一样,但是它们都是以角色为基础,用剧情来推动游戏发展,这是这类游戏区别于竞技类游戏的地方。正因为这类游戏有这种多样性,这类游戏的玩家受众很庞大。
1.2开发RPG游戏的意义
RPG类游戏以其强大的代入感和养成元素一直流行至今,今后在众多的开发者们的努力下,越来越多好的作品被制作出来面向玩家。作为以故事为主体的媒体,RPG也能给人们带来各种情感上的感触,就像电影电视这些传统媒体一样。能够让玩家进入一个新的幻想的世界,打破传统思维定理的约束,去体验与现实不同的事物,使思维发散。这是让思想互相碰撞的好地方。
游戏开发不同于一般的软件开发,它是一门综合艺术,其涉及的理论囊括文科,理科,和工科,学习游戏开发能够让自身在多学科技术的交汇中将这些知识连锁起来,将原本被人工分散的知识重新变为一体。
本次开发的游戏兼具跨平台的功能,可以轻松实现不同运行平台上的部署,而不受限于不同的操作系统和不同的设备。这样使得游戏进行跨平台移植的时候将工作量降到最低,减少进行重复操作时所花费的时间,提升工作效率。
本次毕业设计旨在通过RPG游戏的开发,加深理解c 程序设计、计算机图形学等相关学科知识,学习辅助游戏开发的技术,掌握相关开发工具和应用软件。同时对RPG类游戏的开发过程有系统性的了解,学习和应用josn的数据解析方法,掌握SQLite轻型数据库的使用、chipmunk开源2D物理引擎的使用,以及Box碰撞系统的判断模式,最终完成可运行的游戏成品。
1.3 本次毕业设计章节的组成
本次毕业设计的结构如下:
第一章: 绪论
介绍本次毕业设计的背景,应用开发研究的意义。
第二章:开发工具和技术介绍
本章主要介绍尝试开始制作一款RPG游戏时所要事先准备的一些项目支撑平台和工具,如:Visual Studio,Tiled Map Editor,DB Browser,cocos2d-x引擎。
- :游戏开发算法介绍
本章主要介绍了游戏开发过程中会涉及到的一些算法和物理学数学公式,加深对游戏编程的理解。
第四章:游戏的具体设计与实现
本章主要介绍了一个简单游戏开发的具体实施。包括初期的玩法设计,搭建游戏的场景和控制,数据的处理分配以及战斗系统的设计。
- :总结与展望
对本次游戏开发的心得体会,对过程中遇到的问题的总结归纳,对下一次制作时的一些想法和建议。
开发工具和技术介绍
对于一款游戏来说,不需要从头开始开发,很多工具可以方便的完成多种功能,省时省力并且功能强劲。本章介绍本次游戏开发所用的开发工具和技术。
2.1 Visual Studio 2012
项目使用的编程语言是c ,选择VS作为本次开发的平台,微软开发的Microsoft Visual Studio是一套集成化的开发平台。其支持将编译后的软件部署成Window平台能够立刻使用的版本。
本次开发之所以选择Visual Studio 2012这个版本,是因为cocos2d引擎的缘故。Cocos2d因为版本问题,对高版本的vs支持并不是很好,其所提供的类库会有不匹配的情况发生(这就是使用第三方辅助类库的限制之处)。选择低版本的vs2012来作为本次开发的开发编译平台,规避这些风险。
2.2 Tiled Map Editor
这个工具给开发者提供了一个快速开发游戏的解决方案。最终文件的储存格式为TMX文件,其支持PNG格式的图片素材,并且支持透明度为0的图片。工具在多个语言平台上都试用,cocos引擎也有为这套工具的接入预留了接口,能够实现方便接入,实时修改的效果。利用这个工具来绘制游戏的几个主场景和一些菜单项的背景,虽然这些背景元素都能在代码中实现,但使用这个工具之后可以加快界面的绘制(因为是图形化的操作界面,所以绘制过程速度更快更直观),同时也能便于后期的修改。该工具的具体使用方式会在下面章节里介绍。
2.3 cocos2d-x引擎
cocos2d引擎起初是一套面向移动端游戏开发的引擎,主要给开发者提供一套苹果系统手机的游戏或应用开发的框架。后续版本升级,新增了对安卓,pc端的支持,是一款支持跨平台开发的游戏引擎。其支持的开发语言为c 和Lua,后续衍生的cocos2d-js版本新增了对网页端浏览器的支持,使得开发者可用使用js语言来开发游戏。
Cocos2d-x引擎具有灵活,高效,易于使用的特点,开发者不用去过多的把时间精力放在研究OpenGL库上,通过简单的代码语句就能完成复杂的的图形绘制,其还捆绑了很多第三方的外部库,像是一些物理碰撞引擎,脚本植入等。Cocos引擎还有强大的动画系统,可以有效的处理帧动画时间,使游戏内容变得更加丰富。而且这套引擎是开源项目,降低了私人开发者的开发成本,官方也提供了丰富的文档教学支持。
2.4 sqlite3数据库
相比于一些有名的数据库系统,如sql server、mysql,sqlite3的速度要比它们快,其体积也很小,在一些特定的设备上可能空间只要几百k。小巧便捷但功能齐全是它的特点。不同于那些大型数据库,它不需要一个大的进程服务来维持,而是通过内嵌到目标代码中去靠目标代码来驱动。这样的好处在于其便于移植,从一个终端复制都另一个终端的时候能够随着代码一起转移。当游戏中需要保存一些数据信息(玩家的数值,场景的信息参数等)但又不想让游戏因为额外的数据文件变得很臃肿,这里就要用到这套轻型数据库,将数据库内嵌到游戏本体当中,最后打包发布运行,不用依赖第三方的数据存储。这对于游戏程式来说是相当好的一个地方,游戏程式的开发时刻要注意性能问题,优化的好坏决定了一个游戏的质量,显然这套轻型数据库可以减轻系统在数据读取方面的负担,提高游戏的效能。
DB Browser是一款数据库可视化客户端,可以用这款软件直观的创建管理数据库文件,提高开发效率。
第三章 游戏开发算法介绍
游戏开发很多时候都要创建一个虚拟的世界,而这个世界一般都是以现实世界的定理为基准的。因此需要模拟现实世界的一些事物的运作方式。现实世界的事物是动态的,因此需要使用不同的算法来模拟。本章将介绍在游戏开发中几个常见问题的解决算法。
3.1 A*寻路算法概述
正常情况下要使一个物体从A点到B点需要为这个物体规划路线方案,然后让这个物体依照事先规划的方案来移动。在游戏中,有动态的物体元素,需要将目标物体在这个实时的地图上运动以到达目标地点。在空无一物的地图上实现是简单的,只要实时监测目标点和目标物体的位置就能实现效果,但是绝大多数情况下地图上面会有很多物体不能通过的障碍物,此时物体需要绕过这些障碍物前进才行。这时需要寻路算法为物体规划一条实时的路径。本次采用A*寻路算法来解决这个问题。
A*算法的实质是为需要移动的物体的可移动路径上划分一个权重,从中挑选出最佳的移动路径。简单的来说,将整个地图区域划分成网格状,每次物体移动的距离为一格,可移动范围为自身所在九宫格的八个方向。具体的路径判断基准由以下公式来确定:
F(n) = G H (3-1)
G表示的是起点相较于当前点下一步位置的距离开销。H表示的是当前点到终点的距离开销。
通过计算所得到的值(F)来判断下一步的移动位置,其数值越小越采用。当遇到地图上的不可通过点时(障碍物)忽略这个点,然后重新计算其它方向的G值,看是否有更小的G值。如果没有,不做操作,如果得到了更小的值则返回到父节点位置然后重新计算方格的F值和G值。如果下一步移动的格子是之前没有移动过的格子,则将这个格子的父节点作为当前节点。接下来不断的重复上面的操作,直到到达目标点。
依照上面的步骤可以顺利将物体移动到了目标点,为了得到实际物体的运动路径,需要将物体从终点沿着父节点往起点回溯,这样可以获得一条从起点到终点的路径。接下来只要让物体沿着这个路径移动,就可以使物体绕过障碍物。
使用这个算法,能够大致得到一条路径,但是很多时候,所得到的路径是很奇怪。因为在寻路过程中,始终追寻着最佳的路径选择,这会使整条路径变得很崎岖。事实上需要得到的是一条平滑的移动轨迹,只有这样物体在移动的时候才不会变得很生硬,显得不自然。这里需要对得到的移动路径做锐化处理,优化算法。常用的手段是在移动路径分成不同的线段,然后在每条线段上取相应线段上的相近点。得到相对平滑的路径。
3.2可预测随机数
一个游戏的关卡数据的容量是一个游戏内容是否丰富的一个重要的指标。要想让玩家在游戏过程中不感到厌倦,必须扩大游戏的内容空间。但是游戏程式所要求的空间是有限的,必须要用这有限的资源空间去构建尽可能大的世界。
可预测随机数这个技术可以为这个问题提供解决方案。要在游戏里构建一个看似的无限空间。传统的读取关卡数据来描绘空间的做法显然不能达到要求,需要实时的生成游戏场景。给与每一个物体假定x和y的坐标,用以标注这个物体所在的位置,用一系列生成的随机数来给物体坐标赋值。为了确定这个随机数的具体数值,需要设立一个种子,每次以这个种子数值来生成下一个数,对于数值相同的种子,让其得到相同的结果。这样可以动态的生成一系列随机数,来规划物体的位置。
srand(seed) //seed表示设立的种子
rand()
srand(1)
for gal_x = 1 to 100
for gal_y = 1 to 100
pro = rand() % 100
if pro gt; 60 then //假设60%的可能性命中
universe (gal_x,gal_y) = lock
else
universe(gal_x,gal_y) = unlock
现在已经初步得到了一个看似无限的物体序列组,但是仅仅是得到这个是不够的,目标所要求的世界要看起来更加自然真实才行。这里就需要对于已经划分好的单一物体的一些特性再进行随机性划分。这时的种子是在一个物体的实例化对象上生成的。
3.3脚本化控制流
一个游戏是由逻辑和数据两部分构成的。逻辑指的是引擎的核心算法规则,而数据部分给出的是游戏的数值和内容。例如搭建好一个游戏的舞台,在这个物体上放上一些我们定义的物体,为物体上的玩家或者NPC角色设计相应的动作响应。此时会得到一个相对完整的世界,这个世界需要相应的逻辑来驱动,将这些逻辑写进外部脚本是一个常见的做法。
在代码中写入控制流或者硬编码会使得代码整体变得很臃肿,也不利于代码的调整与更新修改。因此,在本次开发中,采用脚本化控制流来解决这个问题。事先将各种事件响应驱动在代码中预留接口,然后通过读取外部的脚本文件来执行这些驱动。在物体事件进行更新升级的时候,仅需要改变脚本文件,而不需要去修改代码重新编译,这会节省很多的时间。这里需要脚本化的内容元素有:用于游戏流程化事务处理的驱动代码、游戏剧情文本相关的代码、外部接口衍生相关代码等。
使用外部脚本还需要注意一点,外部脚本代码的功能确实有的时候是看起来很便利,且脚本现在的脚本的功能越来越强大,有些甚至已经具备程序语言的大部分功能,但不能被这种便利性所蒙蔽。大部分脚本语言在提供强大的功能的同时是以大量的性能消耗为代价的。滥用脚本会使游戏程式大量占用资源,如果玩家以低帧数运行游戏,这个游戏体验是很差的。固然目前的主机设备性能足够能处理这些消耗,还是要尽可能的减少不必要的性能消耗。合理的判断什么地方该使用脚本,什么地方不能用脚本来驱动是一个要抉择的地方。
3.4 AI设计
游戏里,玩家通过操作角色来驱动角色在游戏世界内展开冒险,而这个世界内除了玩家所操作的角色外,还有很多NPC角色或者敌方角色,这些单位也需要在游戏世界里行动,这时需要AI系统来驱动它们。
AI就是给这样不可操作物体设计一套行为模式,使这些物体能够与环境互动,给玩家一种较为真实的世界的感受。这套系统的设计要考虑互动效果,这里有两种基本方式:通过主动的观察世界(轮询)和被动的等待消息响应(事件驱动)。由于一个游戏内的对象往往会很多,所以这里推荐采用事件驱动的方式。为此要有一个消息通讯的系统,这里的消息内包含了一些描述性的信息,用于传递给游戏对象。这里需要知道这个消息是发给谁的,是由谁发出的以及这个消息的内容。可以给这类消息的接收加一个时间延迟,这样会给玩家更真实的感受,因为现实中对消息的处理是有一定的延迟的。或者为了增加娱乐性,可以设置一个随机时间。
状态机能实现很多功能,它通过将物体的一系列动作分成不同的状态,通过一定的状态信息使状态进行变迁。可以使用上文的消息接发系统,使用消息来驱动这个状态机。
消息的传送如下,一个消息先发送给状态机的头部,如果是有响应的,则执行响应的响应。如果没有对应的响应,则重新发送给顶部的世界响应。这样一个消息必定会有一个响应,不是特定的响应就是世界响应。
图3-1 消息路由过程图
图3-1是一个消息路由的过程。玩家的输入和时钟的更新是唯一的外部来源,所触发的消息会经过消息路由器转发到对应的游戏对象上去。对于这次的所制作的游戏而言,要为多个物体设置状态。比如玩家在操作角色时,玩家通过输入对应的指令,使得角色做出对应的动作。这里每个指令就是一个消息,会被接受然后分发到对应的动作上,然后执行对应的动作动画。战斗时怪物的不同状态响应也是如此,当怪物生命值充足的时候,怪物会积极的攻击玩家,而当怪物的生命值不足时,怪物会有选择的回复自己的生命值。
第四章 游戏的具体设计与实现
在正式开始制作游戏之前,需要将一些素材准备好。这些素材包括游戏中需要使用到的图片资源和音乐资源。这些资源选择互联网上免费提供的文件素材,这些资源是公开的,没有版权,可以直接添加到游戏中。将这些收集出来的素材统一放到cocos引擎中的Resource目录内,之后如果有新增的素材,也放入其中,这个目录是cocos引擎支持能够直接相对路径搜索的。
4.1系统功能模块设计
本次游戏的需求如下:
1.实现游戏中的一些辅助类的设计。
请支付后下载全文,论文总字数:31133字