自上世纪80年代第一部手机诞生以来,随着计算机技术的进步,手机也经历了从模拟到GSM、2.5G再到今天的3G手机如此一个发展历程[1][2]。特别是进入21世纪后手机的硬件性能得到很大的提高,当前主流手机普遍配有主频500MHZ的微处理器和500MB容量的存储器。与之同步发展的还有支持手机运行的手机操作系统,从当初的单片机系统到后来的专用嵌入式系统,到后来开始为智能手机设计开发出可以更高效管理手机软硬件资源的操作系统[2],其中有不少属于开源项目的手机操作系统。目前全球的智能手机操作系统主要以Google公司开发的Android系统、苹果公司开发的iPhone系统、诺基亚公司开发的Symbian系统、微软公司开发的WindowsMobile系统和Linux系统为代表。从图1.1为2010全球智能手机操作系统市场份额统计,Android仅仅经过两三年的发展就抢占了9%的市场份额,并保持着2%的增长速度。中国是最大的手机市场,2010年的统计数据表明,Android已取代了iPhone成为中国市场额最大的智能手机操作系统。
图1.1 2010全球智能手机操作系统市场份额统计
Android系统是Google公司于2007年推出的一款手机操作系统,目前能安装于HTC、摩托罗拉、联想、华为等知名品牌手机。它是基于Linux2.6.1内核的一个开源手机操作系统,目前最高版本为2.3,集成了GPS电子地图导航、重力感应器、多点触控等重要功能,开发者可以开发出丰富的运用。由于Android智能手机操作系统是一个开源项目,具有很强的开放性和可扩展性,吸引了大量的手机软件开发人员为这些手机系统开发应用软件及休闲游戏,极大的丰富了手机功能。为服务广大的开发人员与谷歌手机用户,谷歌公司在因特网搭建了一个应用软件商店。开发人员开发出的手机应用软件可以陈列于应用软件商店中供用户挑选购买,解决了软件工程师最薄弱的软件营销环节,作为目前广大手机软件工程师最大的创收途径而博得广泛的热衷。
电脑游戏是很多人不可或缺的娱乐活动,八九十年达的“贪吃蛇”和“超级玛利亚”给大家留下了欢乐的欢乐记忆,也为游戏创作者带来了巨额财富。近二十年来,随着计算机硬件性能的提升及软件开发者的努力,游戏作品不论是创意还是视听感觉都有飞跃的发展。当前电脑游戏行业非常繁荣,竞争也非常激烈,随着智能手机的问世并普及,越来越多的游戏开发人员把目光转向了手机游戏这个新兴的行业。
手机通常重量轻,随身携带方便,现代人们压力大,非常希望在工作之余,上下班途中可以通过娱乐来放松自己,此时,手机游戏便能发挥出它轻松休闲的特点。受手机性能的制约,以往运行于手机之上的游戏一般较为简单,但随着微电子技术的发展,手机性能越来越优良,现在已经可以开发出类似于PC机上的游戏。特别是随着3G移动网络的迅猛发展,可以预料在十年之内目前如火如荼的网络游戏也将转战至手机平台。
在手机游戏及应用开发方面目前以Android SDK、J2ME MIDP、Objective C为主流开发环境。Android SDK为开发者提供大量全面的API,有SQLite数据库操作的API,也有3D图形图像框架OPENGL ES,还有2D图形渲染的SurfaceView。论文在研究了Android SQLite、图形图像处理、AppWidget框架、多点触控接口、多线程等游戏相关技术的基础上融合中国的传统周易文化实现了一款妙趣横生的宠物休闲游戏。
在手机应用开发领域当前较为火热的有J2ME语言、Object C语言和Android SDK。J2ME[40][44]]作为Java2的一个组成部分,以其发展时间长而成为较为普遍的技术。其最大的优势在于移植性强,使用J2ME技术开发的程序,可以经过简单的修改以后,能在不同厂商的手机上运行。同时由于Java[43]语言的普及从而开发周期大大缩短。但是,也因为兼顾移植性,导致其开发出的功能受到一定的限制,又因为其运行于JVM上并受手机性能的影响所以运行速度普遍较慢。Object C语言基于标准的ANSI C,其语法源于Smalltalk消息传递风格,作为iPhone手机上的标准开发语言而受到青睐。相对于J2ME[39] [40]最大特点是软件运行效率高速度快,界面也继承了苹果的华丽风格,遗憾的是开发出的应用软件只能运行于iPhone手机上。谷歌与开发手机联盟合作开发的Android SDK是近两年诞生的充满活力和生命力的手机开发语言,是一个标准的、开放的移动电话软件平台,不存在任何以往那种阻碍移动产业创新的专有权障碍。相对于其他开发语言,Android最大的优点就是开放性,吸引了众多的开发者的支持,短短两年时间开发出大量的手机应用软件,丰富了手机的应用功能。另外对网络友好,支持大部分网络功能,并与Google应用无缝结合,可以轻松获取Google服务。
图1.2 2010中国移动应用超市各类手机软件下载比例
Android和手机应用市场正处于起步阶段,市场和消费者需要个接受的过程,众多开发者也都在积极探索盈利[31]模式。Android开发者实现盈利主要依赖两方面因素,一是全球Android手机终端的爆发,另外就是海外付费应用程序的模式逐渐形成。目前Android应用开发个人或团体虽未取得规模盈利,但也开始逐渐向盈利模式转移,获得不错收益。图1.2是中国移动应用软件超市2010年的统计数据,消费者下载量最高的依然是应用开发,其次便是游戏开发,占据39%的下载量,而传统的增值业务则只占5%,在移动互联网时代,开发者纷纷逃离营运商的束缚,转向利润较为丰厚的应用程序和游戏开发。由此图也可以看出手机游戏软件在消费者中的受欢迎程度,如果想在未来手机应用程序开发中实现规模则需要加大手机游戏方面的开发力度。
目前在手机上开发出较为成功的游戏主要有FTG格斗游戏、PUZ益智类游戏、RPG角色扮演游戏、SLG模拟/战棋式战略游戏以及体感游戏和宠物养成游戏六类。其中格斗游戏诞生于街机,曾经的“街霸”是其典型代表。FTG系统的核心是对战斗部分进行碰撞检测计算。益智游戏最大的创意是其游戏规则,玩家需要以自己的智慧对游戏规则进行思考,判断从而通关以获得成就感。PUZ游戏对玩家操作要求不高是手机游戏中受众面最广的游戏,最具代表是“推箱子”。角色扮演游戏是最能与用户共鸣的游戏,开启了一扇通往虚拟现实的大门,可以让玩家沉浸于打怪升级的快乐之中,“仙剑奇侠传”是其经典代表。RPG[39]游戏的核心是代表玩家角色成长的升级系统,游戏都贯穿一个故事情节,所以其创意是多元的、立体的,让开发者有更广阔的创作空间。战棋类游戏是玩家在虚拟地图上指挥一定角色与敌方展开战斗,典型的有“地雷战”。体感游戏主要依赖手机中的重力感应等装置开发出的新型游戏,玩家可以通过摇晃、旋转、移动等动作来操作游戏。宠物养成游戏则因为其人性化游戏情节而吸引人们注意力。
手机游戏研发的重点是游戏情节和游戏界面。游戏情节的创作依赖人的想象力和创造力,主题及素材可以来源于热门小说也可来古老传说,例如中国的经典名著“三国志”被日本光荣公司搬去后创作出名噪一时的经典同名游戏。还有著名网络小说“诛仙”也被创作为当前流行的同名网络游戏。这些文学作品为手机游戏的开发提供了大量的可创作素材。同时,行业竞争的激烈也导致雷同的不少游戏情节出现,这就要求创作人员不断发挥才能,构思出更加丰富的游戏主题。游戏界面方面随着手机性能不断提高的影响,也愈加华丽。从当初粗糙单色的俄罗斯方块到后来颜色丰富的2D游戏,再到现在开始流行的极具立体效果的3D游戏。游戏的操纵方面也有革命性发展,从最初按键操纵到后来的屏幕多点触控再发展到重力感应操纵。
随着手机游戏[37]的高速发展,Google公司对游戏开发越来越重视,在新推出的Android2.3增强了对游戏开发支持力度也提升了多媒体影音和通信功能。增加了新的垃圾回收和优化处理事件,以提高对游戏的支持能力。原生代码可直接存取输入和感应器事件、EGL/OpenGL ES、OpenSL ES、新的管理窗口和生命周期的框架。同时还强化了SQLite数据库管理功能,更加方便游戏数据的存取,相信开发者可以据此创作出更加优秀的游戏作品。
论文研究了Android SDK开发环境[23] [28]以及此环境下的SQLite数据库、AppWidget框架、SurfaceView 2D图形渲染技术、Opengl ES 3D渲染技术等手机游戏开发相关技术。在本游戏软件中,首先运用Android内嵌的SQLite数据库实现游戏数据的存取,为游戏的各功能模块提供数据源。其次运用SurfaceView将游戏界面渲染成仿3D效果,并提供游戏操纵接口。最后通过Appwidget框架的BroadCast和Service机制,将游戏界面映射至手机桌面,使用户更直观的体验游戏的精彩。
由于游戏的宠物预测模块涉及的数据库操作,本论文重点研究了两种游戏数据的存取方式。第一种方式为Android内置的SQLite数据库,用于存取大容量的永久性游戏数据,为游戏提供安全稳定的数据源。第二种方式为Share Preferences,是一个轻量级数据存储,用于暂存游戏的中间数据。两者构成游戏的数据中心。
此游戏的最大特色是与中国的古老文化“周易”相结合,将预测、占卜等玄异艺术融入休闲娱乐中。为了在游戏中保持一定的神秘性,本论文还浅层次的研究了五行、八字、卦象等学说,并顺利的在游戏中实现了这些功能,达到了现代文明与古老文化向结合的效果。
根据课题所涉及到的主要内容,论文共分五章,内容及章节安排如下:
第一章,介绍Android手机宠物游戏的研究背景、国内外现状、本论文研究的主要内容和论文的组织结构。
第二章,介绍了Android平台的构架和特性,并与iPhone平台进行比较。
第三章,分别介绍了在实现手机宠物游戏的基础理论、需要用到的相关技术和Android SDK开发环境,重点介绍了SQLite数据库存储技术和AppWidget框架下的Broadcast和Service机制,同时还介绍了重力感应的运用。
第四章,本章主要介绍了手机宠物游戏的实现。用SQLite数据库存取大容量数据源及Share preferences存取临时数据,依照设定的游戏情节设计游戏控制引擎,渲染游戏界面,设计电子罗盘,为玩家提供多点触控来操纵游戏。
第五章,介绍了手机宠物游戏的功能性测试,分别测试了宠物养成、八字算命、姓名测试、情缘速配、电子罗盘、手机桌面映射功能。并进行了游戏的性能测试。
最后,总结了本文的工作,提出未来的研究工作。
本章介绍了手机游戏宠物的背景和意义,在综述了当前国内外研究现状的基础之上提出了本文的研究内容与重点,最后介绍了本论文的组织结构。
宠物鸟游戏的开发主要分为游戏素材创作、游戏代码编写以及游戏测试三大部分:
(一)游戏素材创作的任务是为游戏设计出优美的界面,并将界面的元素如按钮图片、标题文字等以图片方式提取出来以备构建游戏软件的UI。另外一个重要任务是制作宠物鸟的游戏角色动画,并转换成Android程序可以利用的格式以备做动画渲染。
(二)代码编写的任务是在上一章的研究基础上,在Android系统环境中将游戏素材构建成手机界面布局,开发出游戏控制引擎,构造出游戏数据中心、游戏渲染引擎、AppWidget框架以及宠物预测等模块,让这些模块在游戏控制引擎的协调下运作。
(三)游戏测试是在代码编写完成后,通过运行的方式来测试软件是否运行顺利、功能是否正常、性能是否良好。由于Android平台的特殊性,还需要制造一些特别情况,如游戏运行过程中接电话、发短信甚至电量不足等,通过意外情况来测试游戏数据的正常。
由于游戏素材创作与游戏代码编写的工作相对较为独立,为减少创作周期,游戏素材创作及游戏页面制作和游戏代码编写可以同步进行。在代码编写完毕后再进行游戏测试。
游戏素材创作的工作主要包括游戏界面设计和角色动画制作。游戏界面设计生成的素材将用于游戏布局文件的定义,角色动画生成的素材则主要用于宠物养成模块的游戏渲染引擎中使用。
设计Android手机屏幕上的游戏界面[17]是一个新的研究领域,与传统的电脑游戏界面相似但又有很大差别,既要满足游戏交互功能的需要又要考虑界面的美观更要兼顾手机屏幕的特性。
由于预装Android系统的手机生产商有20多家之多,不同生产商及不同型号屏幕特性都不尽相同。手机屏幕与软件开发关系最紧密的特性为分辨率,目前最普遍的分辨率为WVGA 480x800、FWVGA 480x854、HVGA 320x480、QVGA 240x320。为了让游戏运行于不同分辨率的手机之上,需要考虑游戏界面的延展性,尽可能的让游戏运行于不同手机之上时尽量少的偏离预定界面。当分辨率相差较大时不可避免的会偏离预定界面,甚至影响交互操作,这时可以考虑多制作几套游戏界面主题对应不同分辨率的手机屏幕。在Android2.1之前为不同分辨率屏幕配置游戏界面需要在程序中先判断手机屏幕分辨率再匹配合适的相对应的主题界面。而在Android2.1之后系统较为智能的解决了此问题,提供了三个文件夹存放三种规格的界面元素,其中drawable-hdpi存放高分辨率的图片如WVGA和FWVGA,drawable-mdpi存放中等分辨率的图片如HVGA,drawable-ldpi存放低分辨率的图片如QVGA。系统则会自动根据手机屏幕的分辨率去使用相应的图片元素。
图4.1 photoshop设计界面
游戏界面是由图标、按钮、线框、文字等元素组成的平面图,灵活的运用Adobe PhotoShop平面处理软件便可设计制作出美观的游戏界面。游戏界面设计对游戏开发的最终目的在于提供游戏UI的素材以及各素材在UI中的坐标位置以及游戏中文字的颜色提供RGB值。平面处理软件可以将设计图中的UI素材以切片形式到处,恰当的运用参考线可以为UI编辑提供参考坐标。图4.1为Adobe PhotoShop所设计的游戏输入玩家信息界面的设计图,纵横方向的线条为参考线,标了序号的矩形框为需要输出的切片即图标。
角色动画是在宠物鸟养成界面中需要使用的素材,需要根据玩家的操作以及宠物角色的各项指标如饥饿指数、心情指数等来切换角色动画。图4.2为角色动画的切换流程图。
图4.2.角色动画切换流程图
宠物游戏角色动画素材由高兴表情动画、沮丧表情动画两个表情动画和饮水动作动画、喂食动作动画、逗乐动作动画三个动作动画组成,表情动画与动作动画分属两层。表情动画需要循环播放,因此动画的第一帧与最后一帧必须重合。表情动画与动作动画之间需要相互切换,因此表情动画的最后一帧与动作动画的第一帧必须重合,同时动作动画的最后一帧与表情动画的第一帧必须重合。
角色动画制作要求形象可爱,力求吸引玩家的眼球。因为宠物角色要做出各种复杂的表情动作与肢体动作,使用3D设计软件来制作较为合适,可以选择Maya或3D MAX来制作。3D MAX功能强大,可以制作宠物的Biped骨骼动画,再通过Smirk插件为宠物制作丰富的表情动画。图4.3为使用3D MAX软件通过轨迹控制器来调整角色逗乐动作动画。
图4.3使用3D MAX轨迹控制器制作角色逗乐动画
逗乐动画需要播放4秒,帧率为8帧/秒,共32帧。动画要求宠物手脚旋转摆动、眼睛转动、嘴巴张合等动作来组合成可爱的动画,每4秒一个关键帧则有8个关键帧,通过轨迹控制器可以很好的完成角色动画的制作。完成模型制作、材质贴图、动作调整、设定摄像机、生成动画等过程后,可以通过3D MAX的渲染器,生成以预设摄像机为视点的背景透明的连续32动画截图。动画截图为PNG24格式的,可以使用PHOTOSHOP再次进行图像处理以弥补3D处理软件在图像处理方面的不足,如处理动画截图的颜色曝光度、饱和度、图像大小等。由于图像总量较多,手工操作较为麻烦并耗时较多,可以在Photoshop中预定义处理曝光、饱和度等动作,使用批处理去执行这些动作就可以较快的完成这些图像处理操作。
图4.4宠物鹦鹉游戏整体运行流程
如图4.4是宠物鹦鹉游戏的运行流程。整体上需要实现游戏AppWidget框架、宠物养成模块、宠物预测模块以及一个驻后台运行的游戏动画控制线程四个部分。在安装软件的APK安装包之后,在游戏列表中有此游戏图标,点击后将运行此软件。如果是第一次运行,会产生一个后台进程,此进程主要是与AppWidget相呼应,实现手机桌面中的游戏动画界面。在游戏主界面中玩家通过点击界面中的喂食、逗玩等按钮实现与游戏互动,如果在此界面中点击宠物预测的按钮则进入宠物预测页面。宠物预测实现了八字预测、姓名预测、情缘配对等功能,玩家输入相关信息并选择相应功能后,软件返回相应的预测信息。游戏AppWidget是在游戏主界面在手机桌面中的映射,使玩家在桌面中就可逗玩宠物鹦鹉,并有进入到宠物预测页面的按钮。
在Android中应用程序中页面通常是以Activity即活动页为单位的。宠物养成界面为GameActivity.class,宠物预测界面为zyForecastActivity.class,桌面Widget为BirdWidget.class。游戏切换到各活动页后将启动对应功能模块来实现游戏功能,同时连接至数据中心存取数据。宠物游戏的代码实现由游戏数据中心、宠物养成、宠物预测、AppWidget映射四部分组成。
本游戏涉及的数据约有16兆之多,需要一个管理数据的模块来规划这些数据即游戏数据中心。游戏数据中心以SQLite为基础构建的,主要是向各功能模块提供数据支持。在游戏运行过程中产生的一些中间数据则通过SharePreference暂存起来。
在游戏中涉及到大量的数据操作,特别集中在宠物预测模块,其中读表记录的操作占据了绝大部分。图4.5为数据中心封装数据[25][26]的存取操作,为了便于各功能模块的维护,在其它功能模块中不进行SQLite操作,而将SQLite数据的操作限制在游戏数据中心的范围。数据中心将各模块需要提取数据的操作独立封装成若干方法,当其它功能模块要提取数据时调用这些封装的方法即可。
图4.5数据中心封装数据的存取操作
数据中心里封装的提取数据方法的入口一般是待查询的条件集,在方法体内根据查询条件获得满足要求的结果集一般是Cursor即记录,为了将与数据库有关的操作杜绝在数据中心外,需要将Cursor转换为数组,并提交给方法体的出口。
宠物游戏中所需的SQLite数据库文件需要存放于/data/data/package_name/databases路径下才能被SQLite管理,目前,Android系统中还没开发出将数据库文件导入到SQLite数据库文件夹下的方法,需要在应用程序中自己编写此方法。因为受JVM限制,文件读取需要用上的Buffer不能超过2M,故需要将SQLite数据库文件切割成每块1M的文件块,并放入到应用程序的资源文件夹Assests下便于读取。之后将这些文件块顺序读取并合并再写入到SQLite数据库文件夹下供游戏中心提取数据。
数据中心是在SQLiteOpenHelper的基础上构建起来的,在构造方法中用super(context, DATABASENAME, null, DATABASEVERSION)便可初始化SQLite数据库,然后编写可供其他模块调用的数据提取方法,以下为一段给星座情缘配对提取相关信息的可调用方法代码[22]。
//星座配对
public String[] get_xingzuolove(String xingzuoa, String xingzuob) {
SQLiteDatabase db = this.getReadableDatabase();//以只读方式获取数据库对象
String selection = "xingzuo1 =? AND xingzuo2 =?";//查询条件相关字段
String[] selectionArgs = { xingzuoa, xingzuob };//查询条件
Cursor myCursor = db.query("xingzuolove", null, selection,
selectionArgs, null, null, null);//执行数据表查询
String[] myReturn = new String[2];
myCursor.moveToFirst();
if (myCursor.getCount() != 0) {
myReturn[0] = myCursor.getString(myCursor
.getColumnIndex("content1"));
myReturn[1] = myCursor.getString(myCursor
.getColumnIndex("content2"));
}//将结果集转换成字符数组
db.close();
return myReturn;//返回数组保存的查询结果
};
4.4.2 运用SharePreference暂存游戏中间结果
在游戏中需要长期存储一些游戏生成的数据,例如宠物预测模块生成的玩家姓名、八字、星座等个人信息,以便之后不需要重复输入。由于这些信息简单,如果用SQLite数据库保存的话,影响操作效率,因此就需要种替代的方式来存储。SharePreference这种轻量级的键值存储方式非常适合这种要求。
用SharePreference对象存储和获取数据都非常方便快捷。存储数据首先要在Context中创建SharePreference并获得edit对象,之后用putString("key",keyvalue)方法将数据预保存,在commit()方法之后才实现数据的存储。需要获取数据只需要使用getString("key")方法即可,下段代码为保存玩家信息的一部分部分。
SharedPreferences settings = this.getSharedPreferences("pler", 0);
SharedPreferences.Editor localEditor = settings.edit();
localEditor.putString("name", pleyName);
/*省略若干*/
IocalEditor.commit();
图4.6宠物养成模块的实现框架图
在程序列表中点击游戏图标便进入了游戏的主页面。这个页面可以让玩家逗玩游戏角色鹦鹉,需要在界面中实现游戏仿3D动画,并在窗口中提供喂食、逗玩等按钮以实现玩家和游戏角色的交互。图4.6为宠物养成功能模块的实现框架图,宠物养成模块主要是由游戏动画渲染引擎、游戏操作接口、游戏控制引擎所构成的。玩家在点击界面中的操作按钮后会被互动接口的界面焦点监听到,游戏控制引擎会根据点击的单元作出相应的处理,并生成相关的游戏动画数据并交给渲染引擎,渲染引擎通过SurfaceView框架在游戏界面中渲染出游戏动画来响应玩家的操作。
图4.7游戏动画渲染引擎工作流程图
游戏动画渲染引擎的主要任务是将游戏引擎指示的界面元素绘制出来。所以设计动画渲染引擎需要先定制游戏界面,本游戏主页面包括的元素有游戏角色即鹦鹉和喂水、喂食、逗玩、宠物预测和一个宠物状态条,这些元素在界面中的坐标位置都是相对固定的。由于按钮元素不会发生改变,鹦鹉动画的坐标也是固定的,所以动画渲染引擎接收到的就是鹦鹉动画数据和宠物状态条,其余元素是固定渲染的。
鹦鹉动画采用的是仿2.5D动画,就是先用3D动画制作软件做好鹦鹉模型,并制作成喂水、喂食、跳舞等动画,再输出为每秒8帧的PNG动画图片。本游戏需要5套动画来表现游戏内容,每套都为5秒,最终生成的动画图片共有200张背景透明的PNG图片,分别存储在代表不同动画的5个文件夹内。动画渲染引擎实现动画就是连续循环的将这些图片绘制到SurfaceView的Canvas中。并按照游戏情节处理单元提供的信息切换动画。
图4.7为游戏动画渲染引擎的工作流程图。从流程图可以看出动画渲染引擎是通过计数器来控制帧动画的,如果是第一帧则取鹦鹉当前动作动画图片的路径,取出图片路径后关上Canvas的同步锁准备绘制游戏界面,之后就是使用Canvas.drawBitmap()方法根据游戏控制引擎提供的变换矩阵绘制动画图片以及按钮。其他帧则直接根据动画图片的途径合成当前帧需要渲染的图片路径并将其渲染之界面中,以下为部分关键代码。
while (run) {
if (i == 64) {
i = 0; }
if (i == 0) {
strFileNameChange = strFileNameA; }
synchronized (surfaceHolder) {
Canvas canvas = holder.lockCanvas(null);//获取画布
/*中间省略部分代码,包括获取动画图片*/
//画宠物
canvas.drawBitmap(bmScale,intPosOffsetX,intPosOffsetY, null);
//画按钮
canvas.drawBitmap(bmpButa, butaPosX,butPosY, null);
/*中间省略部分代码,包括画按钮和变速齿轮计算部分*/
Thread.sleep(sleeptime); //变速齿轮
i++;
holder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像
}
}
游戏操作接口是游戏控制引擎和游戏动画渲染引擎之间协同工作的桥梁。图4.8为实现游戏操作接口的流程图。当游戏界面渲染出来,玩家点击按钮或抚摸鹦鹉后,游戏控制引擎需要响应这些交互动作,为实现这个交互分功能,必须在界面中建立游戏操作接口[19]。在Android监听点击事件的是方法是onDown(),此方法在SurfaceView中已经提供了,可以通过重载此方法来实现对按钮点击的判断。监听抚摸鹦鹉即手势滑动的方法为onFling(),此方法在SurfaceView中并不提供需要在SurfaceView基础之上实现OnGestureListener接口才能继承。
图4.8游戏操作接口实现框架图
游戏操作接口主要是重载了onDown()和onFling()两个方法,以下为重载onDown()方法判断点击按钮动作的部分代码。
public boolean onDown(MotionEvent e) {
int downX=(int) e.getX();
int downY=(int) e.getY();
if(buta.contains(downX,downY)){
strFileNameA=strFileNameP[0];
return true;
}
if(butb.contains(downX,downY)){
strFileNameA=strFileNameP[1];
return true;
}
return false;
}
4.9玩家操作后的运行效果
游戏操作接口在onTouch的基础上分别实现了多点触控监听、左右滑动监听、上下滑动监听。在逗玩宠物时可以用手上下滑动调整宠物角色动画在界面中的位置,也可以左右滑动来放大缩小宠物角色动画在界面中的大小来观察宠物角色的细节。图4.9为游戏操作接口实现后的运行效果图,右图为玩家手指向上滑动和向下滑动后与左图的对比,表现了角色向上移动并放大。
游戏控制引擎在接收到操作接口提供的动作ID后依据预定游戏情节[18]进行相应的处理。例如点击喂食后鹦鹉作出高兴的动画,并发出高兴的声音并将状态条长度变长。另外在接收到手势动作ID后将改变游戏角色鹦鹉的大小与相对位置这主要是通过矩阵运算来实现的,关键在于保持鹦鹉在界面中永远水平居中需要不断计算动画图片再界面中的偏移位置。控制引擎在进行处理后将一些变换矩阵、图片路径等参数传递给动画渲染引擎,有些生成的数据如宠物的饥饿值、心情传递给游戏数据中心。游戏控制与动画渲染引擎之间通过一个共享类来实现通信,这个类主要用来与渲染引擎传递动画图片的变换矩阵和动画图片的路径。以下为部分主要代码。
switch (operateID) {
//ID=1表示喂水动作,对应切换保存喂水动画图片的路径
case 1:
filePath = "drink/000";
sound = "drink";
status += 25;
/* 省略部分动作处理*/
break;
case 2:
filePath = "eat/000";
sound = "eat";
status += 25;
/* 省略部分动作处理*/
break;
/* 省略部分动作处理*/
//ID=5表示向下滑动动作,对应向下移动动画角色
case 5:
intPosOffsetY += 20;
matrix.setTranslate(intPosOffsetX, intPosOffsetY);
break;
}
宠物游戏在AppWidget[45] [映射后可以让玩家直接在手机桌面上娱乐,漂亮可爱的宠物角色也可以成为手机的主题桌面。
将宠物游戏通过AppWidget框架映射至手机桌面,大致需要经过创建Widget描述文件、创建Widget布局文件、创建WidgetProvider类、创建Service四个步骤。
Widget描述文件主要是描述游戏在手机桌面中占用的屏幕大小、刷新频率以及对应的布局文件。宠物游戏要成为桌面主题自然应该在手机屏幕中满屏显示。在Widget中分辨率需要根据占屏幕的块数来计算,计算公式为(块数* 74)–2,Android手机通常为4块*4块,因此满屏分辨率应该是294dp*294dp。以下为Widget描述文件的部分关键代码。
android:minWidth="294dp"
android:minHeight="294dp"
android:updatePeriodMillis="60000"
android:initialLayout="@layout/widget"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
Widget布局文件是游戏在屏幕上显示的界面,因为Appwidget可支持的View只有TextView、ImageView、LinearLayout等简单的View,所以只能选择性的将游戏的部分元素如角色图片、功能图片按钮映射至桌面。以下为Widget布局文件的部分关键代码。
<ImageView android:id="@+id/ImageView01"
android:layout_height="fill_parent"android:layout_width="fill_parent"
android:background="@drawable/g"></ImageView>
<ImageView android:layout_height="wrap_content"
android:layout_width="wrap_content" android:src="@drawable/button2"
android:layout_below="@+id/about" android:layout_alignParentBottom="true"
android:layout_alignParentRight="true" android:id="@+id/button2"
android:paddingBottom="8px" android:paddingRight="8px"></ImageView>
构建AppWidgetProvider的目的是手机桌面的Widget按照Widget布局将相应内容映射过来,让玩家通过Widget上的按钮与游戏互动,将相应的操作递交给Service处理。构建Service是为了让桌面Widget每125毫秒刷新一张宠物动画的图片形成每秒8帧的宠物动画效果,根据玩家的操作进行处理并切换不同的宠物的动画。以下为Service的部分关键代码。
最后需要在AndroidManiFest.xml中对AppWidget进行描述,说明作为游戏情节控制的服务线程Service、相应服务的Widget前台、刷新Widget的Provider,以下为与AppWidget相关的部分关键代码。
<receiver android:name=".ESTTime" android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/est_appwidget" />
</receiver>
<service android:name=".ESTTime$UpdateService" />
宠物预测界面由Android常用的UI组件来实现的,由LinearLayout和ScroolView进行界面布局,由EditText组件和RadioButton组件接收玩家输入的信息,在界面中提供Button组件并在按钮监听里选择某项宠物预测功能。选择预测功能后启动宠物预测模块根据提供的玩家信息进行预测,并将结果返回页面。
图4.10为宠物预测模块的运行流程图,人靠衣裳马靠鞍,手机游戏是否吸引人去玩关键靠游戏的创意与游戏的UI界面。宠物预测功能融入游戏自然可以吸引客户的使用而增加软件的下载量,同样的一个漂亮的UI也至关重要,所以本小节实现的重点分为UI界面的实现和宠物预测功能的实现。
图4.10宠物预测模块运行流程图
Android软件的UI是由Android XML文件来布局的,可以运用Layouts和Views组件来制作界面布局[34]。在界面布局文件制作好之后并保存于res/layout文件夹下才可以被程序通过setContentView()方法来调用。布局文件中的组件如果希望在程序中引用或修改则需要在定义布局文件时为这些需要引用的组件确定个ID,之后便可以通过findViewByID()方法从界面中将这些组件提取出来。在4.2小节中制作的界面素材通常以ImageView组件的形式安插在布局中,可以设置Scale Type属性来设置其是否可以拉伸来实现界面的延展性,也可以根据4.2小节界面设计时提供的参考坐标来设置变换矩阵Matrix从而确定图片在页面中的其坐标位置。
宠物预测模块的UI[20]界面需要实现数据的输入和输出经过处理的信息。此页面使用的组件包括输入组件EditText、Spinner和CheckBox,EditText编辑框用于让用户输入姓名等文字信息,Spinner用于让用户选择出生年月等信息,RadioBox用于让用户选择性别等信息。输出组件主要使用了TextView输出文字信息。由于输出的信息较多可能一屏无法显示完全,故需要用ScroolView来做布局组件,与LinearLayout及RelativeLayout等布局组件相结合构成了此软件的布局文件。为每个组件起个ID名后在程序中可以通过findViewById()方法获取并。以下为布局文件的部分重要代码。
<RelativeLayout android:layout_height="fill_parent"
android:layout_width="fill_parent" android:id="@+id/Pageperson">
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_height="wrap_content" android:layout_below="@+id/ImageP"
android:layout_width="wrap_content" android:layout_alignParentRight="true"
android:layout_alignParentTop="true" android:orientation="vertical"
android:paddingRight="20px" android:paddingTop="15px">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/ename"
android:textSize="20px" android:text="Kole" android:textColor="@color/pink"></TextView>
</LinearLayout>
</RelativeLayout>
在xml布局文件中各种UI组件都有自己丰富的属性,通过配置这些属性可以实现丰富美观的UI界面。id属性是每个组件独有的代号,供程序根据ID来提取组件来实现信息的输入输出。layout_width和layout_height用于设置组件的长宽单位可以是px也可以dpi,也可以用fill_parent使其最大化到父框架。其他还有textColor、padding等属性。
宠物预测功能是依据中国古代流传下来的周易文化而融入手机游戏中的自娱自乐的功能,为保持一定的神秘性需要遵循周易文化的一些基本准则。论文根据一些调查,从众多的周易文化中提取出部分玩家较为感兴趣的功能与手机游戏结合。用户比较喜欢的功能主要有八字预测及姓名测算、情缘速配、求签三项功能。图4.11为实现八字预测功能的流程图。
图4.11宠物八字预测功能流程图
其他的预测功能与八字预测功能类似,姓名预测关键要计算姓名每个字的笔画然后计算姓名的五个即天格、人格、地格、外格、总格后分析五行属性再从数据库中提取相关信息并进行评分。情缘速配分为姓名配对、星座配对、血型配对等,都高度依赖周易数据库。
图4.12为宠物预测功能实现后的运行效果图,在输入姓名以及出生年月后点击预测按钮则可以预测姓名信息,有基本的五格信息、姓名得分和相关解析内容。由于手机屏幕较小,预测的信息较多,通过手势滑动可以上下卷屏来浏览。预测八字与预测姓名信息类似。
图4.12宠物预测功能运行效果图
电子罗盘是在重力感应的基础上实现的一种测定方位的应用,包括水平仪和罗盘。实现这两者的关键之一在于必须结合Android界面布局特性和矩阵运算对水平仪的横向和纵向水平球以及罗盘的内盘进行初始屏幕坐标定位。由于不同型号手机屏幕不尽相同,无法在设计界面时将水平球和内盘定位至预定位置,必须在程序运行后根据手机屏幕大小和图片大小以及预定的相对位置计算出他们的据对坐标。例如罗盘内盘的X坐标=(屏幕宽-(屏幕宽-85)/2) -(内盘宽/2),在HTC G4手机中X坐标则为-147。另一关键在于根据对重力感应的监听获取不同时段手机X、Y、Z的偏转角,并实时运用矩阵运算变换水平球在水平仪中的位置来表现手机的水平状态,同时自动旋转罗盘内盘到正确方位。图4.13为电子罗盘的运行流程图。
图4.13电子罗盘运行流程图
根据流程图编写的部分关键代码如下
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() != Sensor.TYPE_ORIENTATION
|| event.values.length < 3)
return;
long currentTime = System.currentTimeMillis();
if ((currentTime - lastUpdate) > 100) {
long diffTime = (currentTime - lastUpdate);
lastUpdate = currentTime;
float x = event.values[SensorManager.DATA_X];
float y = event.values[SensorManager.DATA_Y];
float z = event.values[SensorManager.DATA_Z];
configMatrix(x,y,z);//根据偏转角设置变换矩阵
refreshView();//根据矩阵刷新水平球和内盘
}
}
本章介绍了宠物鸟游戏的总体架构,分别设计了架构内各功能模块的运行流程和工作机制,并设计实现了部分功能,同时将他们整合成一个游戏。