基于Android平台的战棋类游戏的设计与实现
2016-11-16倪建新
倪建新
摘要:战棋类游戏是指回合制的,在地图上按格子移动人物进行战斗的游戏,其画面绚丽,策略性高,可玩性强,还拥有丰富的剧情,随着安卓手机性能的大幅提高,该类游戏越来越受到用户的青睐。该文设计并实现了基于Android平台的战棋游戏《森林王子》,首先分析了游戏的整体架构,其次介绍了游戏中剧情模块,地图模块,图形绘制模块,人物角色模块,人工智能模块,游戏数据保存等核心内容的实现方法,最后在真机上调试并实现了该游戏。
关键词:Android;手机游戏;战棋;人工智能;SQLite
中图分类号:TP311 文献标识码:A 章编号:1009-3044(2016)25-0075-03
Abstract: SLG game is turn based, according to the map on the grid to move the character combat game, the screen is gorgeous, strategic high, playability strong, also has a rich story. With the substantial increase in the performance of Androids mobile phone, this type of game more and more favored by the user. In this paper, the design and implementation of SLG game "forest Prince" based on Android platform. Firstly, the overall structure of the game, followed by the introduction Implementation game Drama module, map module, graphics rendering module, characters module, artificial intelligence module, the game data storage module and other core content, the final debug and realized that in the real machine.
Key words: Android; Mobile game; SLG; artificial intelligence; SQLite
随着智能手机保有量和硬件性能的快速增长,全球用于手机游戏的智能手机和平板电脑的数量已经超过10亿台,2015年中国手机游戏市场规模超过400亿元,同比增长47.7%,呈现高速增长的态势[1]。从游戏类型的分布来看,单机休闲益智类游戏数量最多,其中战棋类游戏画面绚丽,剧情丰富,策略性高,可玩性强,该类游戏易进易出,能充分利用碎片化的休息时间,满足近8成用户每天半小时的游戏需求。基于以上背景,本文提出了基于Android平台的战棋类游戏《森林王子》的设计与实现方法,通过游戏整体架构的构建,地图数据载入,图形绘制,人物及怪物角色设计,怪物人工智能,游戏数据保存等核心模块的分析,对Android战棋类游戏的开发方法和实现过程进行了相应的探索。
1 游戏架构分析
本文中的战棋类游戏《森林王子》采用了安卓SurfaceView游戏框架,在架构上主要包括总控模块,前台界面模块,游戏实体模块,后台逻辑模块共四大部分组成。其中总控程序主要用来在各游戏画面之间切换,初始化及载入地图数据,初始化图片资源;前台显示模块主要用来进行游戏剧情,游戏运行画面以及游戏战斗界面的绘制渲染;游戏实体模块则包括游戏中出色的人物角色,敌方怪物以及游戏道具等;后台逻辑模块主要包括地图数据的载入,怪物人工智能,如怪物的行走路径,怪物的攻击碰撞等以及后台数据的保存。游戏的总体架构及各模块之间的关系如图1所示:
2 游戏关键模块的设计与实现
2.1 游戏地图的设计及实现
地图的数据结构设计是整个游戏算法的基础。本游戏为二维平面游戏,用二维数组来映射地图元素和地图数据之间的逻辑关系,将地图中的格子对应为二维数组行列中的一个个单元,单元中存放不同的数值用来表示地图上要展示的不同图形元素,如数值0表示草地,数值1表示树,数值2表示木栅栏等。
用数值表示的地图数据比较抽象,行列数太多时很容易出错,游戏地图在实现时可以首先使用地图编辑器直观的画出来,然后通过行列扫描转换成数值,最后再保存成地图文件[2]。
游戏中设计有若干关卡,需要相对应的地图,当切换关卡时,二维数组中的数值要重新设置以用来表示不同的地图,将事先保存地图文件通过文件操作打开,切换关卡时,将具体的数值读入到二维数组中就可以实现关卡地图的切换。
2.2 前台界面的渲染绘制及切换
游戏中的前台界面主要包括剧情界面,主游戏界面,战斗界面及一些辅助设置界面,主游戏关卡界面扩展自Android的SurfaceView视图,使用独立的画图线程并配合双缓冲技术进行界面的渲染绘制,不会阻塞UI主线程,以满足战棋类游戏画面绚丽的特点。通过Handler机制进行前台界面之间消息的传递和接收从而实现界面的全屏切换。
剧情显示界面和战斗界面这两类遮盖于游戏界面上的窗口设计成包含独立线程的类,满足触发条件时进行触发,遮盖游戏界面部分区域,同时需要从主游戏界面中接管游戏的焦点和游戏屏幕的控制权,以响应触屏操作。剧情和战斗画面显示完毕后,则需要归还游戏焦点和游戏屏幕的控制权,让主游戏画面响应触屏操作,其核心在于OnTouchListener监听器的设置,返回及游戏状态的恢复。
2.3 图片加载技术的改进
游戏实现过程中为了实现丰富的剧情,绚丽的画面需要大量的图片,而安卓游戏架构中加载大量图片或大尺寸图片到内存时经常会发生内存溢出错误(Out of Memory)。为此本游戏没有采用BitmapFactory.decodeResource方法将图片加载到内存,而是重写了自己的图片加载方法readBitmap。首先在readBitmap方法中创建一个12KB的临时空间,其次将BitmapFactory.Options的采样率inSampl-eSize设置为2,这样一来图片占用内存的大小只有原来的1/4,最后使用decodeStream方法直接创建bitmap对象,大大节省了内存的消耗,有效的阻止了内存溢出错误。该方法需要在资源文件夹下Drawable对应的分辨率文件下放置相对应的图片资源,以进行不同分辨率手机的自适应。
2.4 人物角色的移动算法
人物角色移动时按格子一格一格移动,但若格子宽高较大时,人物移动就会一格一格的跳跃,显得很不连贯。本游戏移动算法实现时首先根据触屏按下的坐标换算出目的地在地图行列中的位置,从而计算出本次移动的方向和格子数,其次创建控制人物移动的线程,将每格的距离等分成若干个小步,每移动一小步,将线程SLEEP,这样就实现了人物的无极移动,不会产生跳跃感,最后当人物到达目标位置时,需要根据等分的小步距离,将人物的坐标微调,以确保人物的中心在格子的中心位置。
游戏的地图包含若干行列,当其超过手机屏幕所能表示的行列数后,人物移动时就需要对地图进行滚屏操作。因此在人物的移动算法中,当人物每移动一小步后还需要加入对地图滚屏的判断,人物的坐标加上预设的偏移量若超过手机屏幕的宽高则需要进行滚屏操作[3]。
人物在移动的过程中可能会遇到怪物,障碍物,道具等实体对象,移动时就需要进行碰撞检测,游戏中的人物,怪物等基本都和格子有关,所以碰撞检测算法就采用了矩形碰撞,根据两个矩形对象左上角的X坐标,Y坐标,宽度W和高度H计算出两个矩形有无重叠,若重叠就表示发生了碰撞[4]。游戏中为了表现碰撞的真实性,还需要计算出两个矩形重叠位置的面积占整个矩形面积的百分比,防止产生两个实体边缘碰擦也被视为碰撞的情形。
2.5 怪物人工智能的设定
为了使游戏中的怪物看起来具有智能,游戏中就必须给怪物设定人工智能。本文给怪物制定了两类人工智能策略,一类是守护,算法思路为:在地图守护点周围选择A,B两点,怪物在A,B两点之间徘徊,当人物角色进入守护点立即触发战斗;另一类是进攻,该策略又由两个子目标组成,找到抵达人物角色的路径和跟随路径到人物角色,当移动到人物位置时主动发起战斗。
游戏中执行进攻策略的怪物都拥有一个专门的路径规划类PathPlan,该类的算法为:将地图二维数组中的无障碍物节点映射为一张静态路网图,寻找离当前怪物最近的、无障碍的图节点A,寻找离人物角色最近的、无障碍的图节点B,使用A*搜索算法寻找AB两个图节点之间的最低成本路径,并将结果放置在表示路径节点的列表PathOfNode中[5]。
当路径规划好之后,怪物执行跟随路径到人物角色子目标并找到人物,算法为:遍历PathOfNode,将怪物按顺序在路径节点之间移动,直至列表的末尾。为了减少手机CPU资源的消耗,游戏中并未实时更新怪物的路径规划,只有当人物角色移动结束之后才进行路径的重新规划。
2.6 游戏数据的保存及恢复
本游戏在实现时涉及到大量复杂的数据,如各实体的属性数据,游戏地图数据等,单纯使用XML文件存储对于保存和恢复就较为复杂,因此存储数据时采用了SQLite数据库,根据需求分析创建了四张表,分别是hero表,monster表,tools表和map表。当在游戏中选择存盘或直接关闭游戏时就将人物属性值,怪物列表属性值,道具列表属性值以及当前地图的关键数值,如关卡数,左上角的行列位置等存入到数据库中,创建了SavaDate方法,直接利用标准SQL语句,以当前手机系统时间为标识,将数据存储到SQLite数据库中。当需要再次继续游戏时,利用ReadData方法,选取存盘的时间点,查询出相对应的数据,在总控程序初始化过程中给相关实体对象和地图数据直接赋值。
3 系统的开发环境及运行实例展示
本文中的战棋类游戏《森林王子》采用了Eclipse+JDK6.0+Android4.2的开发环境,在虚拟机和Android真机U879,512M内存,854*480像素配置机器上均可正常运行,游戏运行时采用横屏设置,画面无闪烁,绘制速度快,人物及怪物移动流畅不卡顿,用户体验良好。游戏运行效果如图2所示:
4 结束语
战棋类游戏在PC端有着坚实的用户基础,涌现过一大批优秀的游戏作品。随着智能手机硬件性能特别是内存空间的不断提升,手机端战棋类游戏的开发呈现不断增长的态势。本文分析了基于Android平台的战棋类游戏《森林王子》的整体结构,并对地图,界面绘制,人物移动,怪物人工智能,后台数据库运用等技术要点进行了阐述,为该类游戏的开发提供一些可行的开发思路和开发方法,下一步将对游戏屏幕的自适应做进一步的研究,以兼容绝大多数的智能手机设备,为游戏的商业化开发提供一些帮助。
参考文献:
[1] 艾媒咨询. 2015-2016中国手机游戏行业年度研究报告[EB/OL]. [2016-03-10]. http://www.iimedia.cn/41102.html.
[2] 程和侠, 孙宜南, 黄国兴. 手机游戏地图设计的高级技术研究[J]. 微型电脑应用, 2010(8):9-10.
[3] 吴亚峰,于复兴. Android游戏开发大全[M]. 北京: 人民邮电出版社, 2013.
[4] 于晓霞. 碰撞检测技术在游戏中的应用与实现[D]. 太原: 太原理工大学, 2007.
[5] Mat Buckland. 游戏人工智能编程案例精粹[M]. 罗岱, 译. 北京: 人民邮电出版社, 2008.