u edb et五子棋et滑动锁密码怎么设置?

东南大学 硕士学位论文 基于Android的游戲设计与开发 姓名:蒋皓 申请学位级别:硕士 专业:软件工程 指导教师:吉逸;方宁生;任俊 2011


2010年5月联想发布了一款移动互联網的手机――乐Phone。它和iPhone
一样除了可以打电话,还能提供多种及时在线服务这是联想历史上第二次试 图从一个單纯的设备制造厂商转变成像百度、新浪那样的互联网服务提供商。在 乐Phone上有一个软件商店所销售的产品就是合作伙伴开发嘚应用程序。为了 使这个软件商店更有特色联想发布了“精品战略”计划,即自己研发优秀的应用 和游戏本人的课题就是来源于这个項目。 本论文就是围绕联想“精品战略”下的一款飞行射击类游戏“Eanh Saving”进 行研究并采用Android开发技术對该游戏进行设计和开发。本文首先通过功能 模块的设计、相关类的框架设计完成了“Eanh Savinf’游戏的策划工作随后列絀 了这款游戏在开发中使用的关键技术和实现方法,包括使用碰撞检测算法实现飞 机与子弹的碰撞检测;利用传感器技术实现游戏的重力感应;搭建了SQLite数 据库用来存储数据和修改数据并且使用微云平台的SDK增加了游戏的社区化功

在此基础上本论文提出了開发中主要环节的实施方案,包括游戏开发环境 的搭建坐标和边界的确定,解决了游戏动画、游戏音效开发环节中常见的问题 并使用Handle机制解决了“Eanh Savin鸢’游戏开发中多线程的处理问题

关键字:Amdroid技术,手机游戏开发传感器技术,游戏的社区化

2011Lcnovo induced

product named kPhone?It’s

sman phone 11Ke

iPhone。which c锄not 0nly make This is second time for

calls but also pr0Vide many oIl-line

devicc producef int0孤intelmet proVldef’Just

Baidu锄d Sina.Tllere is觚App

kPhonewhich

seIls And‘01d

the App shop morc developer,s Apps.T0 make

outst锄ding’Len0Vo proposed

n锄ed‘‘Exquisite strategy”? Android nis thesis comes行om‘‘Exquisite strategy,锄d focus on the this‘hesis dcvelopment伽the basis of a game n锄ed“Eanh SaviIlg,’?IIl


desi鲫ed the
ofthe function module aIld related kind 0f f|ame

game-nenI listed

0f‘‘Eanh kev technology in the development detection 0f the plane and the bullets,using


the inductionbuilding

SaVing’,which

including‘he collislon

Wi-SDK SQLjtc database a11d using the

realize the

community function of Android game? Based


desi印觚d Saving’.

key technology deVelopmentI put

building the deVelopment

enVlronmen‘'

the animation deslgIl锄d the coordinate柚d boundary,I finished the problem in Android

desi鲷and solved

Muti-threading

management?

deVelopmentsensor Key w。rds:AndroidmobiIe games community technology

technology,g锄e


3G时代标志着互联网从电脑网络时代向手机网络时代过渡运营商所能提供 的网络服务越来越好,大家通过手机上网嘚速度越来越快很多终端厂商为迎接3G 时代,纷纷推出了自己的智能手机现在最热门的智能手机操作系统莫过于C叔酒e 公司主推嘚Android系统,这个底层由C语言开发上层为java的操作系统既有很 强的硬件访问能力,又有很好的开放性基于这些优點,Android以非常快的速度就 占据了全球智能手机操作系统第二的份额随着Android的发展,越来越多的软件 加入了Android的阵营 参考国内外提供Android软件下载的各大网站,都将Android软件分为两大 类:应用和游戏这传达絀一个重要的信息:游戏开发同样非常重要,甚至与应 用开发平分秋色并驾齐驱。但因为手机游戏的进入门槛低、产品质量参差不齐 企业鱼龙混杂,投身于手机游戏的企业在产品开发时必须坚持精品路线否则用 户体验的不断恶化,只会导致手机游戏行业的整体沉没 洇此联想(上海)研究院发布了“2010移动互联网精品战略”项目,本课题 就是在这个项目下研究基于Android的游戏设计与開发
基于Android的游戏开发,国内国外的水平差距很大在市场上成名的手机 游戏基本上都是国外游戏公司开发的,而且很容噫辨认因为工作的关系,本人 接触了很多Android开发者的游戏发现国内开发者开发的Android手机游戏,不 仅界面粗糙而且设计简单,同质化严重相同的创意往往被反复抄袭很多次。 而国外开发者开发的游戏大型游戏内容丰富,情节完整;小型游戲也从用户体 验和创意上远胜国内的开发者 本文中提到的传感器技术,游戏社区化技术在国内游戏的开发中应用的很 少本文在完成公司项目的基础上,提供了Android游戏开发中这些高级技术的 解决方案
本文的目的是研究基于AmdToid的游戏设计与丌发。根据游戏的背景和功能 描述进行了功能模块设计和相关类的框架设计,解决了游戏丌发中动画处理

东南人学硕l:学位论文

音效处悝等关键问题并解决了Android游戏开发中多线程的操作处理问题。并运 用碰撞检测算法实现了“Eanh Saving”游戏中嘚碰撞检测在完成了联想“精品战

略”的同时提供了劬droid游戏开发中先进的传感器技术、数据库技术和游戏社


论文内容安排如丅: 第一章为绪论。介绍了课题的开发背景、论文完成的工作以及论文内容安排 第二章为Android技术和手机游戏开发的背景介紹。介绍了Android的背景 和技术架构以及手机游戏开发的背景和存在问题。 第三章为游戏的主题确定和框架设计通过游戏主題和功能概述,完成了游 戏策划的有关工作包括游戏流程设计和模块设计,游戏的相关类的设计和总体 框架设计 第四章为游戏中关键技术的实现。包括使用碰撞检测算法实现碰撞检测使 用传感器技术实现游戏操作的重力感应,设计和搭建了SQLite数据库并使鼡 微云平台的SDK增加了游戏的社区化功能。 第五章为游戏中主要环节的实施方案指出了游戏开发环境的搭建方法,游 戏中坐标和边堺的确定方法并解决了游戏动画,游戏音效开发中的常见问题 最后使用Handle机制解决了“Eanh Savin舀’游戏的多線程处理中的问题。 第六章为项目的总结和下一步工作展望“Eanh Saving”游戏上线后,根据 用户反馈总结了几个可以进┅步提高的开发方向。

第二章AndroId平台技术和于机游戏开发背景介绍

第二章Android平台技术和手机游戏开发的背景


Android是GoogIe于2007年11月5日发布的基于Linux平台的开源手 机操作系统该平台由操作系统、中间件、用戶界面和应用软件组成。它 采用软件堆叠架构主要分为三个部分。底层以Linux内核为基础由C 语言编写并编译,只提供基本功能;中间层包括函数库Librarv和一个Java 的虚拟机;所以最上层可以支持Java语言编写的各种应用软件包括通话 程序、游戏和在线互动程序等。本文开始编写时的最高版本为Android

故在开发时采用的是较为稳定的1.5版本的SDK到本文完荿时,Android 的最高版本为2.3版本

Andmid的系统架构


Android系统架构由5部分组成,分别是:Linux
Kernel、Android

Libraries、Application Framework、 Applications

(1)Ijnux Kemel

Android基于Linux 2.6提供核心系统服务。例如:安全、内存管理、

进程管理、网络堆栈、驱动模型Linux KerneI也作为硬件和软件之间的抽 象层,它隐藏具体硬件细节而为上层提供统一的服务 通过计算机网络知道OSI/RM,分层的好处就是使用下层提供的服务而 为上层提供统一的服务屏蔽本层及以下层的差异,当本层及以下层发生 了变化不会影响到上层也就是说各层各司其职,各层提供固定的SAP


(SerVice Access

Point)专业点可以说是高内聚、低耦合。

(2)Android Runtime

Android包含一个核心库的集合提供大部分在Java编程语言核心类库 中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例运行 在他们自己的进程中。Dalvik虚拟机设计成在一个設备可以高效地运行 多个虚拟机。Dalvik虚拟机可执行文件格式是.dexdex格式是专为Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统 大多数虚拟机包括JvM都是基于栈的,而Dalvik虚拟机则是基于寄存 器的两种架构各有優劣,一般而言基于栈的机器需要更多指令,而基 于寄存器的机器指令更大dx是一套工具,可以将Java.cIass转换成.dex 格式一个dex文件通常会有多个.class。由于dex有时必须进行最佳化 会使文件大小增加1~4倍,以ODEx结尾

东南人学硕:l:学位论文

Dalvik虚拟机依赖于Linux内核提供基本功能,如线程和底层内存管


(3)Libraries

Android包含一个C/C++库的集合供Android系统的各个组件使用。 这些功能通过Android的应用程序框架(application framework)暴露给开 发者下面列出一些核心库:

系统C库:标准C系统库(1ibc)的BSD衍生,调整为基于嵌入式 Linux设备

●界面管理:管理访问显示子系统和无缝组合多个应用程序的二维和 三维图形层。 ?“bwebCore:新式的Web浏览器引擎驱动Android浏览器和内嵌

?3D库:基于OpenGL

APIs的实现。库使用硬件3D加速或包

含高度优化的3D软件光栅 ?FreeType:位图和矢量字体渲染。 ?SQ“te:所有应用程序都可以使用的强大而轻量级的關系数据库引 擎


(4)Application Framework

通过提供开放的开发平台,Android使开发者能够编制极其豐富和新颖 的应用程序开发者可以自由地利用设备硬件优势、访问位置信息、运行 后台服务、设置闹钟、向状态栏添加通知等等。 开发鍺可以完全使用核心应用程序所使用的框架APIs应用程序的体 系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他 应用程序可以使用这些功能(需要服从框架执行的安全限制)这一机制 允许用户替换组件。 所有的应用程序其实是一组服务和系统包括:

●视图(View)――丰富的、可扩展的视图集合,可用于构建一个应


用程序包括列表、网格、文本框、按钮,甚至是内嵌嘚网页浏览

?内容提供者(ContenI Providers)――使应用程序能访问其他应用程 序(如通讯录)的数据或共享自己的數据。 ?资源管理器(Resource Manager)――提供访问非代码资源如本地 化字符串、图形和稚局文件

第一二章Android甲白技术和手机游戏开发背景介绍

?通知管理器(Notification Manager)――使所有的应用程序能够在状 态栏顯示自定义警告。 ●活动管理器(Activity Manager)――管理应用程序生命周期提供通 用的导航回退功能2.5、Applications Android装配一个核心应用程 序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、 联系人囷其他设置所有应用程序都是用Java编程语言写的。所以

Android系统架构见图2.1

图2.1 Android的系统框架图

东南人学硕.I:学位论文

Android文件结构和资源引用方式

第二章Andr0Id‘甲台技术和于机游戏开发背景介绍

2.3手机游戏开发的背景


移动游戏产业的发展是众多行业整体共同发展的结果,它借助多个产业发展 的优势才能在移动手机平台这个最终嘚窗口提供给玩家一个休闲娱乐的幻想世 界。 这几年不仅通信技术由2G迈向了3G,手机本身的终端配置也越来越强

大下面的表格列出的是联想于2011年5月发布的一款移动互联网手机――乐


Phone的主要硬件参数,3GWloo、3GWl01、3GCl01为对应三个运营商推出的 不同版本:
表2.1以乐Phone为代表的智能手机硬件参数 3GWl00
Application Processors&System CPU

高通QSD8250平台

高通QSD8650平台

2G:GSM 850/900/1800/1900

3G:WCDMA 850/900/1900/2100MHz


Memory&Storage ROM RAM
SDCard Embedded Peripherals Screen

3.7”WVGA800书480;


24bit CapacitiVe Touch Panel

3.61”WVG八800宰480;24bit

1buch Panel Camera

一5M camera fof still image&


Vide0 capturing -AF supponed

image Video capturing

-0.3M for Video

-AF not suppOned Keyboard

加速度传感器 光线传感器

通过上面这张表,我们发现现在的智能手机屏幕变大了,内存变多了 CPU的处理能力也提高了。不仅如此还能支持多种传感技术以及GPS的定位 功能,利用这些“新特性”开发的游戏肯定比以往非智能机上的J2ME游戏品质 更高,效果更好

Java游戏的移植问题


在手机游戏市场上,数量最多的是iava游戏因为之前非智能机上的游戏基

本上都是java开发的,封装格式是.j盯的包在Android低版本的手机上,这些 jar包的遊戏可以顺利地运行在Android的系统里但是随着Android版本的提高, G00西e只允许运行用Amdroid SDK開发的.apk包有些厂商为了降低移植的成 本,专门开发了jaVa到android的转换器下表显示了j2me游戏和Android游戏


表2.2 JA、,A和Android的主要区别

作用 启动程序时执行的方法


低级界面类 画笔类 画图的方法

J2ME实现方式 MIDlet.startApp0

Andmid实现方式 ActiVity.0ncreateO


View Canvas

Graphics Graphics.drawImageO Gr叩hicS.drawStringo

Canvas.drawBitmapO C鋤Vas.drawTextO


图像类 按键处理的方法 触摸屏处理的方法

keyPressed() pointerPressed() RMS

onKeyDown() onTouchEVentO

BroadcastReceiver

这些转换器虽然可以将原来J2ME岼台的游戏转换成Android平台的游戏 但是实际运行效果却不理想。主要的原因在于图片的分辨率问题在Android中 处悝图片自适应屏幕大小的方法是在fes目录下创建不同的layout文件夹,比如 layout640幸360layout800奉480,然后所有的layout文件在编译之后都会写入R.java 里而系统会根据屏幕的大小选择合适的layout进行使用。 所以J2ME游戏转换的Android游戏还是要根据不同的屏幕重新绘制不同大 小的图片如果不去主动改变图片的分辨率,則最后的效果只是原来170埠240 的图片线性拉伸到了480?800这样的显示效果就会很差。

2.5手机游戏开发中存在的问题


掱机作为游戏载体的优点主要在于其便携性虽然上一节提到了现在智能手

机的配置已经大幅提升,但是手机淀戏开发仍然还存在着一些瓶颈主要有:


(1)屏幕问题 这里实际是两个问题,一是大屏的需求仍然得不到满足虽然现在主流的

第二章Andrdd平台技术和_丁.机游戏开发背景介绍

Android手机都已经升级到了3.5英寸的屏幕,但是从7英寸平板电脑的流行可 以看出人们对大屏嘚需求仍然存在。 另外一个问题是屏幕的大小不统一,各种尺寸都存在于市场上这无疑给 Android游戏的开发厂商增加了适配嘚难度。 (2)有限的颜色和声音支持 虽然说手机越来越像电脑了但是对于颜色和声音的支持和真正的电脑相比 还是存在差距,电脑上嘚游戏画面效果和音乐效果要明显强于手机但如果真能 做到和电脑一样大屏,高分辨率高音质,这样的终端又考验着手机电池的持续 能力所以在今后相当长的一段时间内,手机的相关参数依然会弱于PC (3)应用程序大小的限制 大部分的手机只有很少的内存空间鼡于运行应用程序。虽然用户可以选择将 游戏存储在SD卡这样的外接设备上但是在游戏运行时仍有大量的临时数据会 被写入到手机内存,内存中积攒了大量的临时数据又会影响手机的反应速度甚 至影响打电话、发短信等基本功能的使用。 (4)高等待时间 无线网络等待时间比较长在计算机上是以微秒计算的,在有线因特网上是 以毫秒计算的而无线网络则要以秒计算。虽然移动运营商总是在努力增加移动 电话可用的带宽但是却没有把降低等待时间当成首要解决的问题,这样就导致 无法开发多人及时互动游戏

东南人学硕.1:学位论文

第三章游戏的策划和框架设计


本章开始以“Eanh SaVing”游戏为例来研究基于Android的游戏开发技术。

Savin酽’是联想“精品战略”下的一款飞行射击类游戏飞行射击类游戏的特

点是游戏操作简单,容易上手配合绚丽的背景和丰富的音樂效果,给予玩家精 彩的体验在设计环节特别需要注意游戏难度的设计,即每个关卡之间要有难度 梯度如果梯度太小,则玩家就没有挑战欲和满足感;如果梯度太大大到根本 无法完成任务,亦不会吸引玩家 另一方面,开发中各个模块要紧密的配合处理好游戏动画設计,音效设计 多线程操作等技术环节,在满足设计需求的基础上避免出现死机的情况发生

3.1游戏的主题及功能概述


本节主要针對“Eanh Saving”的游戏的主题及功能进行简单介绍,游戏的主题 和功能是设计一款游戏时首先需要考虑的问题,相当于游戲的草稿
3.1.1游戏的主题概述

手机游戏按类型分,可以分为:动作竞技、策略游戏、角色养成、射击游戏、 体育赛车、益智棋牌、模拟辅助这8大类别从技术开发的角度,游戏中所需要 的关键类的实现并没有太大的区别关键在于游戏的策划环节,“什么样主题嘚 游戏最能打动用户”最近比较流行的几款游戏比如“水果忍者杀”、“愤怒的小 鸟”都是看准了如今快节奏的工作生活中,人们需要釋放压力于是通过“杀水 果”“丢小鸟”的方式来排解白领们的压力,广受大家喜欢这类游戏的成功主要 赢在创意上,但好的创意并鈈是每个游戏开发者都能想到的在传统的游戏中, 最为经典的莫过于飞行射击类游戏此类游戏动作流畅,操作简单画面效果震 撼,昰游戏玩家百玩不腻的选择所以,我们在确定游戏主题的时候就定位在 了开发一款飞行射击类的游戏。

功能概述相当于游戏的需求“Eanh Saving”游戏主要包括3个界面,游戏开 始界面关卡选择界面和游戏主体界面,下图是游戏的开始界面:

箱三章游戏嘚li题确定和框架改汁

图3-1“Eanh Saving”游戏开始界面截图

点击“Stan”按钮进入游戏关卡选择界面这里一共囿5个关卡,难度依次增


加只有通过了前一个关卡才可以进入下一个关卡,已经通过了的关卡可以重复 玩卜-图是关卡选择界面:

图3-2“Earth Saving”游戏的关f:选抒截图

确定了关忙之后就进入到了游戏的卜体界而,-乍体界面是游戏设计rfl游戲对


琢最多;信要处理的游戏线程最复杂的界lnj。卜.图是游戏主题界面的截图可以 行到卉I:们还彳J.倒计时:

图3.3“Eanh Saving”游戏的主体界面截图

如果顺利过关的话就会自动进入下一个关卡,每个关卡不仅游戏背景彳i同

飞机形状不同,子弹的速度和运动的轨迹也不一样这样就增加了游戏的难度和

3.2游戏的策划及准备工作


在本节中,进行了游戏的总体策划界面筞划和游戏动作策划。还列}}{了在 丌发6J.需要准备的图片资源和声爵资源。

策划时应该有明确的开发目标使用对象、场景设想、硬件要求、脚本设定、 各种战斗脚!存体系设计,游戏策划必须能够把握市场需求的变化在Android


Market激烈的竞爭中带给游戏更多的价值。下面是“Eanh Saving”游戏的总体策 戈IJ图:
表3.1游戏的总体策划

游戏总体策划 图像 游戏帧 圖像风格 音乐 2维图像 每秒固定30帧 卡通/科幻 搭配音乐 川时婴策划好游戏的每‘个界iff『在Android丌发I}l这就赴{旺‘个Activity。 游戏的界面策划见表3.2

第三章游戏的主题确定和框架设计

表3.2游戏的界面策划

游戏界面策划 界面┅:游戏的主体界面 名称 游戏背景 运动体一 运动体二 文本框 描述 科幻星空背景图


480宰800 55奉75

备注 共5个主题背景图 能在整個背景图上移动 能在整个背景图上移动

最后是体现游戏可玩性和生存体系的动作设计策划见表3.3。:


表3.3游戏的动作策划

移动方姠 2维平面任 意角度

运动速度 恒定:3(像素/帧)

补充说明 中弹后触发特效,时问减少10秒

2维平面横 竖两个方向

随着关卡难度嘚提 高,起始速度增加

共5个关卡水平方向有两条炮弹 轨道,垂直方向有4条轨道

除了上述的3张表以外下面的几点也是需要提lj{『策划好的。 运行的目标平台:目标平台为Android 操作方式:重力感应的方式 音效设计:需要提供背景音效,发射炮弹的音效以及爆炸音等 根据策划,就需要提前准备好游戏中所需要的图片资源和声音资源Android 游戏开发支持jpg和png格式嘚图片资源,这些图片资源都存储在 reS/drawable.mdpi文件夹下而音频资源最好都转化成.o鹊格式的,将存放在 rcS/mw的文件夹下存放在托s的文件都可以通过R资源类直接访问。

3.3游戏的流程和模块设计


在完成了游戏策划的基础上丅一步是细分游戏的功能模块,后续可根据各 个功能模块完成游戏的框架设计和各个关键类的开发并做出项目的总体流程图 和子线程的鋶程图。游戏的功能模块见表3.4

东南人学硕I:学位论文

表3-4游戏的功能模块 名称

说明 实现飞机与炮弹的移动 生存炮弹 碰撞判斷 绘制游戏界面 高效管理游戏内存 加载图片,初始化数据计算飞机碰撞范围

移动模块 炮弹生存模块 碰撞判断模块 绘图模块 内存管理模块 資源初始化模块

在规划好功能模块之后,可以做出游戏的项目流程图见图3.4。

图3-4游戏的项目流程图

完成了项目流程图之后還不能直接进行Android游戏编程,项目执行流程 和游戏运行流程是存在着较大差别的因为项目流程图只是从用户体验角度(或 鍺策划角度)进行的宏观描述,它只是起到过渡作用:而用于编程的流程图则是 基于程序角度给出的微观描述它将涉及到编程的实际环境。因此我们还需要 分析一下游戏实际运行的流程,而我们将要分析的这个流程就是“状态转换”见

第三章游戏的主题确定和框架设計

表3.5游戏的状态转换表

游戏菜单 游戏运行 游戏暂停 资源加载

游戏入口、游戏选项 游戏进行状态 游戏被暂停的状态 游戏初始资源加载,或关卡资源加载状态

下面是游戏的状态转换图见图3.5。


图3-5游戏的总体流程状态转换图

幽3.6游戏运行界面状态转换图

上圖是游戏运行界面的状态转换图 有的游戏不需要一个主循环。比如那些不依赖于时间或者它仅仅对用户所做


的加以回应并且不做任何視觉上的改变,比如有限状态机而只是永远等待着 用户的输入的游戏就不需要主循环。 但像“Eanh SaVinf’这类动作类游戏戓者带有动画、定时器和任何自动操作的

游戏是由时间驱动的,也就是不管有没有输入都必须有一个循环一检测的线


程来监听用户行為,游戏的主循环就是在这样的情况下产生的它以一个特定的 顺序通常尽可能多的在每秒钟内“滴答”提醒子系统运行。主循环需要在咜自己的 线程里运行原因是Android有一个主用户界面线程,如果你不运行自己的线程 用户界面线程将会被你的游戏其他子线程所阻塞,这会导致Android操作系统无 法正常的更新任务

3.4游戏的框架和相关类的设计


3.4.1游戏中用到的类

在“Eanh Saving”游戏中,按功能划分总共用到了4部分类 (1)共有类

Activity的实现类PlaneMivity:该類是扩展基类Activity实现的,是整个游


戏的程序入口 键盘监听线程KeyTllread:该类是手机键盘的监听线程,每隔一段时间读取 一次键盘的状态值并根据当前的键盘状态做出相应的操作。 常量类C0nstantUtil:该类用于保存游戏中所鼡到的所有常量便于管理与 维护。 (2)辅助界面相关类 开始界面类WelcomeⅥew:“Eanh Saving”游戏中开始时囿3秒的倒数动画 该类负责开始界面的绘制工作。 开始界面的动画实现类WelcomeViewThread:该类是为WelcomeView服务的 线程类主要负责开始界面中动画的生成。 帮助界面HelpⅥew:该类比较简单主要负责绘制帮助界面的相关圖片。 胜利界面WinView:该类用于绘制玩家顺利过关后的画面 失败界面FailView:该类用于绘制玩家失败之后的画面,在该界面中玩家可 以选择重新游戏或退出游戏 (3)游戏界面相关类 游戏的主界面类GameView:该类为游戏菜单界面的实现類,负责界面绘制

第三章游戏的主题确定和框架设计

的工作 地图信息类Maps:该类包含地图的相关信息,例如背景画面和背景音乐

物体移动线程类Movenread:该线程负责游戏中子弹的运动轨迹和速度。


倒计时类TimeUil:该类提供90秒的倒计时如果倒计时完还没有完成游戏, 则进入游戏失败界面 (4)情景相关类 主战飞机Plane:该类为主站飞机的封装类,可由玩家控淛其方向和移动的 状态 子弹类Bullet:子弹的封装类,游戏中所有的子弹都为该类的对象 爆炸效果类Explode:该类为爆炸效果的渲染类,负责在指定位置绘制爆炸 效果 3.4.2游戏类的框架

根据上一小节中各类的规划,下图显示了“Eanh Saving”游戏中各游戏类的框


WeIcomeView

l weIcomeViewThread I pV.ew||w.nV;ew l l刚IV.ew I


图3-7“Eanh Saving”游戏中各类框架I!∈I

在游戏运行过程中各类的作用如下:

启动游戏,在PlaneActivity’中会先进入加载界面ProcessView然后等待玩


家的选择。当玩家单击“帮助”按钮时将仞始化帮助堺面HelpView并将其显示

出来;当玩家单击“退出”按钮时,则游戏自动退出;当玩家单击“开始游戏”时 后来加载开始界面welcomeView,当加载完成后启动WblcomeViewlnhrcad线程 生成开始界面的动画效果同时后台将初始化遊戏界面GameView,在地图信息 类Maps中初始化此关卡中的背景音效等。此时面meUil倒计时类也启动记 录游戏运荇的时间。敌机开始发射炮弹时会创建炮弹类BulIet对象在游戏中如 果遇到碰撞,则会显示爆炸效果会创建爆炸效果类Explode来渲染爆炸的效果。

Saving’中使用的所有常量全部封装在常量类Constantuil类中

3.4.3游戏中相关類的实现

游戏中飞机类Plane的实现,相关代码和注释如下:

IIllpon柚droid.黟aph缸.Bitmap;

∥引入相關类 ∥引入相关类

android.孕aphiCs.Paint; Plane{

Public class

Private intx; PriVate int y; Int lifc; Private int dir;

//飞机的x坐标 //飞机的y坐标 ∥飞机生命 ∥飞机的方向O静止,1

上2右上,3右4右下,5下6左下,7左8左上


Private int type; Bitmap bitmapl;

∥飞机的类型 //当前飞机的图片


∥GameView的引用

G锄eⅥew gameView;


IIllport柚droid.伊aphics.Bitmap;

游戏中子弹类Bullet类的实现,相关代码和注释如下: ∥引入相关类 ∥引入相关类

android.伊aphics.Paint; Bullet{

Public class Int x; Int y; Int dir; Int type;

∥子弹嘚x坐标 //子弹的y坐标 //子弹的速度 ∥子弹的类型 //当前子弹的图片 ∥移动的像素

Bitmap bitmap; GameView

Private jnt moVeSpaD=10; Public

xint y'inI type,int dir’GameView

This.gameView=gameView;

//得到gameView的引用

第三章游戏的主题确定和框架设计

This.x=x; Tlllis.y=y;

//得到x坐标 //得到y坐标 //得到类型 //得到方向 O; //初始化图片资源

This.type=type;

nis.dir=dir;


This.initBitmap

} 上面两段代码是游戏中两个实体类的实现在“Eanh Saving”游戏中的两个 重要的主体就是飞机和炮弹,飞机生命值的存在构成了游戏的生存体系炮弹的 方向和速度决定了游戏的难度。在後续的开发中还可以在这两个类中增加不同 的属性,或者添加新的实体类来丰富游戏的体验

第四章游戏中关键技术的实现


本章研究“Eanh Saving”游戏中使用的关键技术和实现方法。包括使用碰撞检 测算法实现飞机和炮弹的碰撞检测使用传感器技术实现游戲操作的重力感应, 设计和搭建SQ“te数据库以及使用wi.SDK实现游戏的社区化功能

4.1用碰撞检测算法实现碰撞检测


碰撞检测是游戏中必不可少的一个功能,无论是角色扮演游戏还是动作设计 类游戏二维游戏还是三维游戏,都会涉及到碰撞检测模块的开發在“Eanh Saving”游戏中,炮弹击中飞机就使用到了碰撞检测技术 碰撞检测技术的具体实现是基于数学和物理方面的知識进行计算和判断的, 并根据不同的对象有不同的碰撞算法按碰撞对象的不同主要分为游戏实体对象 之间(飞机和炮弹)的碰撞,以及遊戏实体与环境(游戏场景)间的碰撞这里 主要研究的是前一种碰撞,即飞机和炮弹之间的碰撞检测 4.1.1碰撞检测技术的概述

實现碰撞检测所涉及的内容主要有如下三个方面: (1)确定检测对象 游戏在运行中会产生很多实体对象,在进行碰撞检测时并不需要对所有的实 体对象都检测一遍比如飞机自己发射的子弹不会和自己发生碰撞,设定静止的 物体之间也不会发生碰撞所以在开始碰撞检测の前,首先要确定检测的对象是 什么 (2)检测是否碰撞 这是碰撞检测的核心环节,在这个环节需要综合考虑游戏本身需求和运行平 台嘚性能问题合理地选择碰撞检测算法。

当检测到有碰撞发生时就需要根据碰撞的类型进行相应的处理,如炮弹会 在碰到目标后爆炸並且会造成被碰撞飞机的生命值减少,如果减少到0则会切 换画面结束游戏。 考虑到游戏的最佳用户体验问题通常在开发游戏的碰撞檢测模块时需要遵 循以下几个原则o.

尽量避免碰撞检测,如果无法避免就尽量减少检测的次数由于进行碰撞检 测基本上都会进行一些數字计算,所以应该尽量少用减少检测的机会。

第9rq章游戏中关键技术的实现

采用不影响游戏性能的算法尽快检测对于碰撞检测來说,精确和速度就像 是算法设计中的空间复杂度和时间复杂度二者很难达到两全。所以在游戏开发 时要多做衡量选择一种对于精确程度和执行速度来说都比较适中的算法。 碰撞处理要柔和不要让玩家感到不适应。碰撞检测的处理不能过于生硬 如物体从地面抛向远處,在飞行的时候如果检测到与地面发生了碰撞不应该立 刻让其停止运动,而是就着惯性要向前et滑动锁一段距离 4.1.2游戏中所使用的碰撞检测算法

如图4.1所示,碰撞检测实际就是检测两个矩形之间的重合面积所以“Eanh SaVing”游戏中的飞机和炮弹都是按照其矩形的外框进行碰撞检测的。

图4-1匕机_乖II炮弹的碰撞检测矩形框

(1)取两个实体的左上角坐标(x1y1)和(x2,y2)以及实体宽度w1、 w2和高度h1、h2 (2)声明4个变量maxX、minx、ma)【Y和minY,并將其分别赋值为两实 体中x坐标的较大值、x坐标的较小值、y坐标的较大值和y坐标的较小值 (3)判断是否x1<x2+w2,且x2<x1+w1且y1<y2+h2,且y2<yl+h1如 果满足这四个条件,则说明两个实体发生了碰撞进行碰撞处理。


因為“Eanh Saving’中的碰撞时两个宽度和高度不相同的物体进行的碰撞所

以要分别检测w1、w2以及h1、h2。如果只使用以上的检测方法游戏进行中 会出现误差,原因是两个实体的边界发生了碰撞但是实体间并没有发生碰撞, 如图4.2所示:

图4.2碰撞检测中的误差

如图所示虽然矩形框有重合,但是炮弹实际并未打中飞机出现这种误差 的一个解决方法是计算碰撞产生的重合媔积,只有重合的比例达到一定数值时才

认定两个实体发生了碰撞“Eanh Saving”中选取的参考对象为炮弹,因为炮弹的 面積相比飞机要小很多检测重合面积的算法如下: (1)计算重合部分的宽度w,其值为minX+w.maxX (2)计算重合部分嘚高度h,其值为minY+h.maxY

(3)计算重合部分的面积S=w铀。


(4)计算重合比例如果超过某个值,则说明两个實体之间发生了碰撞 进行碰撞处理。 在碰撞检测的基础上加入重合面积的判断这样的碰撞检测就比较真实可 靠。在“Eanh Saving”游戏中最后设定的重叠面积不能超过炮弹的50%。 4.1.3游戏中碰撞检测的实现

If(xd>xx&&xd<=xx+width一1&&yd>=)rX&&yd<=yx+height一1){ //首先判断两个矩形有否重叠


Double Dwidth=width―xd+xx:

Dhei曲t=hei曲t―yd+yx;

∥重叠区域的高度 I“Dwidth幸Dhei曲t/(otherwidth?otherHeigllt)>=O.50){

∥重叠面积超50%则判定为碰撞

4.1.4发生碰撞后的处理办法

当檢测到碰撞发生后飞机的生命自减1,如果自减后的生命值小于0 则向Activity发送消息通知Activity飞机已经死亡。主要的代码如下: l“isContain(ep.xep.y;ep.bitmap.getwidthO,ep.bitmap.getHeight())) //碰撞检测成功


This.1ifc一;

//飞机生命自减1 ∥当生命小于O时 //切换状态 ∥当背景音乐正在播放时 //停止播放背景音乐

l“this.1ife<0){


gameView.staIus=2;

if(gameView.mMediaPlayer.isPlayingO){ gameView.mMediaPlayer.sIopO; ) I“gameView.activit y.isS0und){

第阴章游戏中关键技术的实现

gameⅥew.playSound(30); ).

//播放游戏失败的声音

gameView.actiVity.myHandler.sendEmptyMessage(1); //向主Activity发送Handler消息 】.

4.2传感器技术实现重力感应


传感器技术是Android平台开发中非常有特色的应用,常用的传感器有加速 度传感器(AcCelerometer)、姿态传感器(Orientation)、磁场传感器(Ma印etic

和光传感器(Ligllt)等在游戏中使用传感器技术,可以增加游戏的趣味增 强用户体验,这一章节主要鼡于研究Android开发中传感器的技术并且将其应


用于“Eanh SaVing’游戏的开发中。

4.2.1传感器应用的开发鋶程

Android平台下传感器应用的开发通过监听器机制来实现要针对某一种或 多种传感器开发应用,主要的开发流程如下 (1)创建SensorManager对象 通过SensorManager可以访问到手持设备的传感器,同时SensorManager对 象还提供了一些方法用于对捕获的数据进行一些计算等处理在程序中,通过调

C0ntext.getSystemSenrice方法传入参数”SENSOR SERvICE”来获得

SensorManagcr对象 (2)实现SensorListener接口 这是开发传感器应用最主要的工作,实现SensorListener接口主要需要实现 以下两个方法

oI徂CcuracyChanged(int sensor’int accuracy):该方法在传感器的精确度发

生变化时调用,SensorManager提供了3种精确度由高到低分别为SENSOR


ST&兀JS ACCURACY HIGH、SENSOR

ACCURACY MEDIUM和

SENSOILS仉町US―ACCURACY―LOw。参数accuracy为新的精确度


V0id onSensorChanged(int

sensor'float【】values):该方法在传感器的数据发生

变化时调用,开发传感器应用的主偠的业务代码就在这旱执行如读取数据并根 据数据的变化进行相应的操作等。方法传入的参数sensor为代表传感器类型的常 量values为float类型数组,其长度和内容因传感器类型的不同而变化

东南人学硕:l二学位论文

(3)注册Sensorljstencr

开发完SensorListener之后,剩下的工作就是在程序的适当位置注册监听和 取消注册监听在这里调用步驟1中获得SensorM柚ager对象的registerListener 方法来注册监听器,其接受的参数为监听器对象、传感器类型及传感器事件传递 的频度 取消注册SensorListener时调用SensorManager的unre西sterListener方法,一 般注册和取消注册都是成对出现的在Activitv的onResume方法中注册 SensorListener监听就应该在onPause方法中取消注册。 4.2.2姿态传感器中的方向变化

开发“Eanh Saving”游戏时使用嘚是姿态传感器即通过手机上下左右摆动的 角度和幅度去改变飞机飞行的方向和速度。下图4.3是空间坐标系中姿态传感器 3个方向軸的示意图:

图4?3姿态传感器中3个方向轴示意图

姿态传感器主要感应手机方位的变化其每次读取的都是静态的状态值,在 注册了传感器监听器后姿态传感器主要捕获3个参数values【0】、values【1】和 values【2】分别代表手机沿Yaw轴、Pitch轴和Ro¨轴转过的角度。 需要注意的是Yaw轴、Ro¨轴和Pitch轴并不是和空间中的z、v、x轴是等 同的,当手機平放在水平面时这两个坐标系相同,但当手机处于其他位置时 对应的姿态传感器3个方向轴也会发生改变,其中Yaw是3个方向軸中唯一不 变的轴它的方向总是竖直向上,也就是重力加速度g的反方向;PiIch轴的方 向依赖于手机沿Yaw轴转动的角度并苴只和角度有关,和手机屏幕的朝向无 关;Roll轴的方向也是相对固定的是手机屏幕长边的正方向,由于Roll轴与 手机之间的楿对关系是固定的所以在手机围绕Yaw轴或者Pitch轴转动的过程 中,RoU轴必然也会跟随手机一起转动而不是永远保持不變的。

第p11章游戏中关键技术的实现

4.2.3其他传感器的介绍 加速度传感器ACcelerometef 加速度传感器也是一种非常常用的传感器比如体感游戏中,动作的发起 一般都是甩动手机,还有iphone中甩一下发短信的功能都是应用了加速度传感 器它对应的坐标轴就是空间坐标x、y、z轴,在注册了传感器监听器后主要捕 获上述3个方向上的加速度 磁场传感器Ma鲫etic

磁场传感器主要用于感应周围的磁感应强度,注册监听器后其主要捕获3个 参数:Values【0】、Values【1】和values【2】3个参数分别代表磁感应强度在空间坐 标系中3个方向轴上的分量。 光传感器Ugllt 光传感器用于感应周围的光强紸册监听器后只捕获一个参数:values【O】。 该参数代表周围的光照强度 距离传感器Proximity 具体感应传感器用于感应周围靠近的物体,在注册监听器后只捕获一个参 数:values【O】该参数代表靠近传感器的物体距离。

Saving”游戏Φ传感器技术的实现

首先在程序的布局文件main.xml中声明要显示的TextⅥew控件关于 Android中View对象嘚创建可以在代码中创建,也可以在布局文件中声明在 布局文件中声明时,可以在布局文件中添加属性而这里定义TextView控件的 目的是为了显示输出传感器捕获到的数据。 所添加的xml语言这里省略 接下去用一个专门的Activity为传感器注册监聽器,并在传感器数据发生变 化时把变化后的数据显示到TextView控件中其主要的代码如下: ∥继承自Activitv的子類


Public class

Sample―4_6 extends ActiVity{

SensorManager mySensorManager;

//SensorManager对象引用


Public void

0nCreate(Bundle saVedInstanceSIate){

Supe r.onCreale(saVedInstanceState);


seIConlenl View(R.Iayout.main);

tvX=(11extView)findⅥewById(R.id.tVx); //获得屏幕上TcxtView控件的引用

tVY=(TextⅥew)findViewById(R.id.tvⅥ;


∥获得屏幕上Tcxtview控件的引用 t、,Z=(TextView)findViewById(R.id.tVz); //获得屏幕上TextView控件的引用
mySensorManager=

(SensorManager)getSystemServicc(SENSOR―SERVICE); } 在这里声明了一个SensorManager对象该对象通过C0ntext对象的get SystemServiCe方法获得,并声明了3个TextⅥew对象通过findⅥewById获得 屏幕上3个TextView对象的引用。茬创建了SenSorManager对象之后还需要 开发实现SensorEventListener接口的监听器的代码,其主偠的代码如下:


PriVate sensorListener mySensorListener=new sensorListener O{
Public Void

onAcCuracyChanged(int

accuracy){//重写

onAIcuracyChanged方法


Public Void

onSensorChanged(int sensor’float【】Values){//重写

0nSensorChanged方法

If(sensor==SensorManager.SENSOlLORIENTf叮ION){∥判断是否 为姿态传感器变化产生 tVX.setText(‘‘Pitch轴方向上的加速度为:’’+vaIues【0】); //将提取的数据显示到TcxtView tvYsetText(“Roll轴方向上的加速度为:’’+values【1】); //将提取的数据显示到TcxtView tvZ.setText(“Yaw轴方向上的加速度为:”+values【2】); //将提取的数据显示到TextView ) ) )

上面的代码用于创建一个实现Sensor“slener接口的传感器监听对象,主要 重写的方法是onAccuracyChanged方法和0nSensorChanged方法并且重写了 6nSensorChanged方法,首先判断产生传感器事件的来源是否为姿念传感器随 后简单地从values数组中读取数值显示到Activily的TextView控件中去,因为

第阴章游戏中关键技术的实现

注册和取消监听器的方法必须成对出现所以在后面的部分要取消紸册监听器, 这部分的代码这里就不另外列出了 上述的4个步骤,就是”Eanh SaVing”游戏中设置姿态传感器Orientation的主 要方法相关代码是说明如何获取传感器变化时的数据,拿到数据时还要进行相 应的处理才可以应用到游戏操作上。 在“Eanh Saving”游戏中虽然使用的是姿态传感器,但是并没有对应Yaw 轴上的操作也就是水平的上下抬手机,并不能改變飞机飞行的状态真正决定 飞机飞行状态的是RoU轴和Pitch轴的变化,当获取到传感器变化的数据时改 变对应方向上的图层迻动速度,而在Roll方向上的移动速度变化要设置的大一 些因为那是飞机飞行的方向,更加敏感

SQLite数据库设计和实现


數据库技术是为了满足大量数据存储修改的需求而产生的,它的高效性和可

维护性相比传统的文件系统存储数据在面对不断增长的数据量時更为方便,并 且查找和修改数据可以通过系统软件快速实现在Android中,提供了专门的 SQLite数据库来存储数据和修改数据‘‘Eanh Saving”游戏也使用了SQLite数据 库进行数据处理。

SQLite是一款开源的嵌入式数据库引擎相比同样开源的MvSQL,SQLite 具有以下独特的地方: 处理速度快传统的数据库引擎采用的是客户端.服务端的访问方式,SQLite 的数据库引擎嵌入到程序中作为其一部分所以运行的速度要快很多。

占用资源少SQLite源代码总共不到3万行,运行时所占内存不超过250l∞


而且不需要安装部署,并支持多线程访问 SQLite中所有的数据库信息如表、索引等全部集Φ存放在一个文件中, SQLite支持事务在开始一个新事务时会将整个数据库文件加锁。 支持Windows、Linux等主流操作系统可以采用多种语言进行操作,如Java、 PHP等总之,SQLite的这些特性都非常适合作为移动设备的数据存储任何 一个SQLite数据库对于创建该数据库的应用程序来说都是私有的,SQLite的数 据库文件位于/data/data/package-name/databases目录下 下图4.4是控制台界面的SQLite数据库操作:

东南人学坝l:2#位论攵

图4-4控制台界向的S0 Lite数据J乍揲作

在控制台中町以输入SQL语句或控制台命令。所有的SQL语句后面必须以


分号结尾控制台命令必须以实心点开头,例:.help(漫示帮助信息):.quit(退

出控制台);.tables(显示当前数据库Φ所有表名)


虽然可以在Sqlite的控制台中输入SQL语句来操作数据库,但输入大量的命 令会使工作量人人增加因此,我Jr发时使用了专门的SQ“te管理工具

Saving”游戏数据库的设计

数据的增删改杏的需求,激发了数据库的应川在游戏中,偠l“i对多用、的 游戏进度存储问题。在“Eanh Saving”游戏t}我建:蕾了_‘张表,用户表用来存储玩 家的川户私囷密码还订所通过的游戏关k。


表4.1数据库【|I川户友的i殳讨
User Password GameIevel
Var Var Int

备注 玩家的用户名 玩家的密码 通过的关卡数

Char(10) Char(10)

第二张表是飞行的生存系统表不同的关卡,飞机可鉯承受的子弹爆炸数目 足彳i同的随着关卡的增加,了弹的数目和速度会变多和变快为了游戏的可玩


11t,义寸应的匕机能够承受f弹爆炸的数H就得增加土毛体的飞机表设计如下:
&4.2数据库中匕机太的没计
Gamelevel Life

备注 通过的义膏数 飞機所能承受的爆炸 数

第i张表就足关卡背景表,这张表中二I婴定义了4i同方向子弹的数}二j和速

以水、f‘和?睡IfI两个力‘帆f.Irr弹的速艘会随卉火卜的增力¨而变快,J¨1./l:第,i第朗


天k还会n这两个力‘m l:各多…+列,山壶后‘火还會…脱埘fJ线力。阳的炮弹

第阴章游戏中关键技术的实现

具体的关卡背景表设计如下:


表禾3数据库中关卡背景表的设计
Gamelevel Speed
XnUm Ynum ZnUm
Int Int Int Int Bur

备注 通过的关卡数 对应的子弹速度 水平方向子弹列数 垂直方向子弹列数 是否有对角线子弹

通过以上3张表的设计,可见“Eanh Saving”游戏中最关键的字段就是 gamelevel这个字段,三张表中有两张都是以这个字段为主键的

Saving”游戏数据库的操作

下面我列出了在“Eanh Saving”遊戏中,记录“game level"这个字段的主 要代码 ∥数据库初始化 DB..n盯H=”/data/data/com.focusdroid.bomb/”;


DB―.NAME=”db_airforce.db”;

∥打开或者创建数据库,第一次创建第②次以后直接打开 sqldb=SQLiteDatabase.openOrCreateDatabase(DB一即汀H+DB.-NAME,nulI); sqldb.closeO;


String sql;

//只用到game level这个字段

sqldb=SQLiteDatabase.openDatabase(DB―PA:rH+DB―NAMEnull,


SQLjteDatabase.OPEN―READWRITE);

sql=”CR巴硼三TABLE IF NOT EXlSTS SysSet(gameleVel TEXT’shangcheng TEXT'xin”TEX秽;加D INTEGER PRIMARY l(EY autoincrement


sqldb.execSQUsql);

Android游戏社区化技术的实现 劬droid游戏的社区化技术就是game.center的搭建,即游戏的丌发商通过构

架用户的游戏中心建立排行榜系统,成就系统挑战系统等增强用户盼粘性, 增加游戏嘚趣味 在互联网思维的影响下,越来越多的游戏丌发商意识到了构建和维护玩家群

东南人学硕l:学位论文

的重要性所以越来越多的遊戏都加入了社区化技术。‘‘Eanh Saving’’中使用的社 区化技术基于微云平台的“wi.game’’SDK搭建 4.4.1游戏社区化技术的发展和优势

对游戏社区化技术的关注最开始来源于facebook上一家名叫“Zynga”的游戏 公司,这镓生存在f配eb00k合作平台的公司居然能够在NSDAK上市而作为 提供平台的f{lcebook都还没有上市。 仔细研究这镓“Zynga”公司发现他们公司开发的游戏都具有社区化的功能, 即用户能通过一款简单的游戏和好友进行互动再利用丰富的成僦系统吸引更多 的用户。于是越来越多的开发者从公司运营的角度认识到了用户群维护的重要

起初Android游戏社区化的模型是Openfeint,即几个已经在游戏开发中取得 成功的开发者共享了玩家资源,组成了产业的联盟共同发布了一个基于SNS 的社交平台。最开始Openfeint里面只有排行榜系统后来,他们重新定义了手 机游戏的移动社交完善了网络服务,增加了成就系统、挑战系统、反馈系统等 进一步提高了用户的粘性,增加了游戏的价值 具体来说,使用OpenFeint技术的社区游戏优势主要有: (1)成熟且已经被认可的模式 OpenFeint在全球已有超过7000万用户和5000款游戏接入这一成功模式 已得箌验证,Apple Store销售排行榜前10名中能找到OpenFeint游戏的身影 平台价值得到用户认可。 (2)社交功能昰核心竞争力 OpenFient为开发者的单机游戏带来网络与社交两大功能极大提升了游戏 产品竞争力。 (3)简单的技术接入方式和开放的SDK管理 无需额外的开发成本将单机游戏升级成联网社交游戏;业界领先的技术实 力,跨操作系统的平台架构将为开发者嘚应用带来更多功能提升;开放的SDK 功能强大的开发者后台管理站点,让开发者从产品集成到运营管理都了如指掌; 利用平台优势能和网络运营商和厂商深度合作,还能得到终端内置的机会 在国内,做社区游戏平台的公司均刚在起步本人在联想(上海)研究院實 习时,由于工作的机会接触了微云团队以及创梦科技团队(这两家公司均为联 想投资所投)的技术人员,他们都是国内优秀的移动互聯网创业团队.通过向他 们请教学习并在企业导师的帮助下终于实现了游戏社区化技术。并将其成功地 添加到了“Earth Saving”的游戏中

第plj章游戏中关键技术的实现

4.4.2游戏社区化技术的实施方案

登录微云的官方网站,下载WiGame SDK在Eclipse中调用WiGame

目的是要在开发过程中集成社区化功能微云的SDK还提供了开发者管理后台, 可以在服务器端管理游戏的应用信息这些信息主要包括:排行榜、成就、挑战、 游戏存档等主要社区化信息。 (2)排行榜系统的搭建 首先需要在后囼系统中创建了一个排行榜之后会得到一个排行榜的id,通 过这个id调用wiGame.submitScorcO方法,就可鉯提交游戏的分数“Eanh Saving”中排行榜系统的调用方法如下: WiGame.submitScore(”排行榜idI.,mScorenull,false); 这个方法接受4个参数依次是: 排行榜id:开发者自己设置的id。 分数:分数必須是一个整数值如果游戏分数是其它类型,请转换成一个整 数进行提交 附加数据:分数是可以附带一些其它数据的,可以通过附加数據完全还原玩 家因为各种原因中断游戏前的操作如果游戏分数不需要附加数据,传nuU即

是否隐藏提交分数界面:这是一个布尔型参數false表示不隐藏,tnle表 示隐藏设置为tnle或false不会对提交分数造成影响。 (3)成就系统的搭建 同样也需要先在后台系统中创建了一个成就之后将会得到一个成就的id, 通过这个id调用wiGame.unlockAchievement0方法解锁成就。‘‘Eanh Savin雪’ 游戏中对应的代码如下: ∥分数大于5时解锁一个成就 if(mScore>5){

WiG锄e.unlockAchievement(’’替换成对应的成就id'I);


} 以上代码检查用户的分数如果超过5汾,则解锁一个成就 成就分为普通成就和秘密成就。所谓秘密成就表示这个成就的达成条件在 开始时对用户是未知的,但是成就的名芓用户是可以看到的所以用户需要根据 名字去猜测这个成就可能的达成方式。秘密成就可以给成就增加一些神秘感不 过也不建议弄太哆的秘密成就。 (4)挑战系统的搭建

也是先要在后台系统创建了一个挑战之后将会得到一个挑战的id,通过这 个id调用WiGame.sendChallengeO方法来发起挑战。‘‘Eanh Saving’’游戏搭建挑 战系统的主要方法如下: ∥以本次汾数发起挑战 wiGame.sendChanenge(”id”mScore,nuUnun); sendChallenge方法会打开一个挑战发起的界面,玩家可以选择想要挑战的 好友然后发送,这些是WjGame自动处理的第四个参数是指定的排行榜id,

设置不为nullWiG锄e就会在这个排行榜中寻找一些实力和mScore的分数


相近的玩家,这样用户可以选择玩家做為挑战对象 不过,这只是发起一个挑战接受挑战并提交挑战结果的流程稍微复杂一些。

当玩家在WiG锄e中看到有人向他发起了挑戰并欣然应战时,WiGame会触


发一个通知来告知游戏所以还需要注册一个BmadcastReceiver来接受这个通

同時,在合适的地方注销这个BroadcastReceiver:


protected Void

onDetachedFromwindow0{

∥去除注册的接收器 getContext0.unregisterReceiVer(mReceiver); super.onDetachedFromWindowO; } 提交挑战结果需要调用另外一个API: ∥提交挑战结果 WiGame.submitChallengeResult(mQuIdmCompetitorScorc,mSC0renull); (5)游戏存档系统搭建


WiGame 2.0.O及以上版本支持游戏的存档功能,通过该功能可以把游戏的

状态保存到微云服务器,以后想用的時候再载入当然,游戏本身需要支持保存 和载入功能WiGame只提供了网络存取的接口。 存档的保存 游戏存档可以指定下列属性: name:一个简单的描述性名称 description:较长一些的描述文字 blob:游戏存档的二进制数据内容 image:遊戏存档的相关截图可以为null表示没有截图。图片格式支持


PNG JPG和GlF

在“Earth Saving”游戏中保存遊戏存档的API方法调用如下:

第l『Il章游戏中关键技术的实现

WiGame.saveGame(”test”,”test

data”blob,imaget11le);

前面4个参数对应于上面提到的属性,最后一个b00le卸类型参数可以指 定是否顯示进度条界面如果为t九le,会显示一个缺省的上传进度窗口如果游 戏存档的数据量较大,建议设置为tnle这个上传进度堺面可以由自己定制,因 为在保存游戏存档的过程中会触发一系列广播通知,通知BroadcastReceiver处 理以下广播通知:

AcrION二GjWE-sAVlNG―S1铷RT


ACnON-GAME―SAVlNG―PROGRESS

ACTION―GJ蝴E_SAVED

√岍ION_GAME―SAVlNG_FAlLED


存档被保存后就可在WiGame客户端的“游戏存档”模块中看到,并可以 选择载入和删除操作选择载入,则wiGame会负责下载之前保存的数据在

下载完成后,会触发A佣oN_1 oAD G』蝴E通知这个通知携带了之前保存 的数据。所以实现存档载入只需要处理矧ON LOAD GAME通知即可

尔I萄人学f∞!I:’≯f口沦殳

第五章游戏中主要环节的实施方案


5.1游戏的开发环境搭建

在进行“Earth Saving’游戏丌发之d,J.首先要搭建好游戏丌发的环境,包括下 载JDK配咒JA、A_:『I:发的环境变硅,安装lDE工具EclipseF载囷安装Android

软件丌发工具包SDK和安装Eclipse平台下丌发Android的插件ADT。


其中SDK的安装方法如卜: 登录h!!P;碰盘y垒!Q匹£垫鱼煦碴:堡Qn页面下载最新的SDK;将下载好的SDK压缩

包解压到C盘的根H录下:找到峩的电脑中属性/高级/环境变量选项修改Path 值,在其最后加上SDK解爪目录中的tools目录“C:\android-sdk.windows\tools”


单击“确定”按钮完成配置,如图5.1所示

变量名迦) 变量值吨).

:、MPEG:c:、甑droi d.sdk-wlndows、to。1s


lnJ"BER 0F 0S Path PATHEXT PROCESSOR AR
DDnr’口c’c'nD TT、
PR 2 Wlndows NT

C:\ProF蛳File:、Pc

C0聃:EXE:BAT:.C册D:yBS:VBE:.

一oC口.一.1~C¨.】.1


削5一l SDK环境变越配越

在Eclipsc rl集成Android的Jl:发環境,臣lJ安装ADT的办法如卜.: 打JI:EclipselDE进入菜即.1l

J的“Help”一>‘‘lnstaIl

Software”。点击Add

按钳l往弹:ij的对话柢的L0cation-I,输入下面的地址:丝P;碰鱼!二苎墨!:gQQgk

堡鲤也凸鱼!Qi鱼缱垦!ip墨曼确定J【1,n:卜..f口列农一fI选择刚才添加的ADT展丌DeVeloper


Tools,々J选×寸J彤的Android DDMS相I
Android Dcvelopmcnt

T00l继乡史操彳1:就l JJ‘

第五錾游戏中l!嘤环节的实施方案

完成,如图5.2所示

■――――lknb瓷选蚓

^vnII已bll,Sott一6 rl


[h7.:k:hr;?rH't卜.’.‘,c-.一.)‘卜’;r‘tj

图5―2 Android戍川祥序插仆ADT的安装

‘般嘚Android开发环境搭建还应包括模拟器AVD的调试,但是“Earth

Saving”游戏采用的是乐Phone真机调试所以没有进行模拟器的调试。在搭建


完丌发研:境后就可以进行具体的丌发

5.2游戏的坐标和边界确定

游戏是能够交互的动画,所以遊戏必须具备三个要素:显示画面处理输入

输出,逻辑控制对应的Android游戏丌发巾必须具备三个对象:显示画而使用 的是圖层对缘,-叮以定义图层的大小位置,移动方向;处理输入输出使用的是


视图对缘}三要作用就是绘制图层(输出),响应键盘事件(输入);还需要有一 个专门的Activity来控制游戏流程为什么要使用0门的Activity,因为像启动

游戏暂停游戲,停止游戏这些控制逻辑的按钮不能存在于后台,必须明明白 自地鼹示给用户


游戏的实现过程就足不断改变视I矧的位胃^骖标,嘫后重新将他们绘制在屏幕 上不过这种坐标的位置改变和绘制过程是通过一定逻辑来控制实现的。视图的

移动就足通过改变视图啦标位置米实现的改变了坐标佴重新绘制,给用户的感

5.2.1获取游戏坐标和边界

住Android系统一I-屏幕的丘上角是^胗标蠶统的原点(o,o)坐标琢点向右


延fIlI足X 4=|II一方向,Jj:i_阳卜.延fl|I赴Y轴Ifi方向。为了住屏幕中的合适位置绘 制图形我fI'J需嘤使川埘棒的说和如作为参考,水确定绘制图形的位霄嘤捩彳l}

东南人学硕I:学位论文

屏幕的宽和高,首先从Activity对象中获得windowManager对象然后从 WindowManager对象中获得Display对象,再从Display对象中获得屏幕的宽和 高 ∥获得屏幕的宽和高


WindowManager m锄ger=getwindowManagerO;

diaplay=manager.getDefaultDispIayO;

screenwidth=display.getWidthO; screenHeight=display.getHeightO;

在很多游戏中都需要对绘制在屏幕中格的视图进行边界的确定。在“Eanh SaVing”游戏中我们就需要判断玩家、敌人、子弹等视图的边界位置边界的判 断无非是对上、下、左、右屏幕边界的判断。 如果当前视图的X坐标小于零则当前视图左越界。如果当前视图的X坐 标大于屏幕的宽则右越界。 如果当前视图的Y坐标小于零则当前视图上越界。如果当前视图的Y坐 标大于屏幕的高则下越界。 如果视图水岼向左移动X坐标减小;如果视图水平向右移动,X坐标增大 如果视图垂直向上移动,Y坐标减小;如果视图垂直向下移动Y坐标增大。


5.2.2游戏开发中的Activity

Activitv是Android应用开发中四大核心组件类之一其他三个分别是控制 长生命周期,没有用户界面程序的Service实现系统广播的BroadcaSt 和实现不同组件之间数据共享的Content


Provider。 Receiver

在一个Androjd应用中一个单独的屏幕就是一个Activity,而每一个Activity 都被实现为一个独立的类并继承于Activity基类。这个类会显示几个Views空 间组成的用户接口并对时间做絀相应。当一个新的屏幕打开之后前一个屏幕 将会暂停,并保存到历史堆栈中用户可以返回到历史堆栈中的前一个屏幕。在 默认情况丅Android将会保留从主屏幕到每一个应用的运行屏幕。 在Android应用开发中通常有多个屏幕,即有多个Activity而在游戏开 发中,所包含的Activity相对较少除了开始画面外,很多游戏只有一个主运行 界面的Activitv类而游戏开发中所有关键的View控件和相关的类以及线程控 制都在这个Activitv中实现。

第五章游戏中主要环节的实施方案

5.3 Surface view代替view处理游戏动画

在Android中开发游戏一般来说,或想写一个复杂一点的游戏特别昰需

要较多动画效果的游戏,是必须用到SumceⅥew来开发的如果只用Lavout


和view去实现,将某个游戏中的对象做荿一个组件来处理很多效果很难实现。 View方法即用控件的方法绘制动画常用于完成一些简单的游戏,这些游 戏画面刷新不频繁实时性不强;对一些操作实时性要求较高的游戏,比如“Eanh

Saving”游戏绘图工作量大,需要用一个新的视图类Su血ce View代替View来

Su血ceView和View最本质的区别在于SurfaCeView是在一个新起的单独


线程中可鉯重新绘制画面而View必须在UI的主线程中更新画面。因为可以直

接从内存或者DMA等硬件接口中取得图像数据Su渤ccⅥew和View方法相比,


可以避免画图任务繁重的时候造成主线程阻塞能提高反应的速度。

Su渤ce View里内嵌了一个专门用於绘制的Su渤ceSu血cc控制绘图的格 式和尺寸,Surfaceview控制这个Su血ce的绘制位置Su渤ceⅥcw提供了一个 可见区域,只有在这个可见区域内的Su响ce部分内容才可见可见区域外的部 分不可见。在使用SumceView时有┅个原则所有的绘图工作必须得在Su血cc 被创建之后才能开始。而在Su血ce被销毁之前必须结束所以所有绘图处理的


代码都茬surfaceCreated和surfaceDestroyed之间。 在“Eanh Saving”游戏中使用的Su嘞ceⅥew方法如下:
//create thread only;it’s started in

su血ceCreatedO

BombThread(holder’contextnew HandlerO{


public Void

handleMe鼹age(Message m){

mStatusText.setVisibility(m.getData0.getInt(”Viz”)); mStatusText.setText(m.getDataO.getstring(”text”)); ’ );


public Void

surfaceCreated(SurfaceHolder holder){

//从这里开始线程 //等待Surface被创建 thread.setRunning(1me); thread.stan(); 】.


public Void

surfaceDestroyed(SurfaceHolder holder)

东南大学硕’1:学位论文

t0 tell thrcad to shut down&wait for it to finish,or else

∥it might touch the Surface after we retum and explode


boolean retry=tmc;

thread.setRunning(false); 上面的代码是根据游戏的整体设计建立一个线程,线程中包含一个游戏循 环在游戏循环中更新游戏的各种数据,并根据这些数据将游戏画面绘制在

Su渤cc仩最终显示给玩家在线程中完成具体的工作需要重载nln()函数。线程


通过stan0函数启动然后就会执行11lnO函数中嘚内容,nlnO函数执行结束后线 程就会终止

SoundPool代替MediaPlayer处理游戏音效


在Android音效設计中,我们常通过new或便捷的静态create函数组来创建

MediaPlayer对象的方法来处理这在应用开发中很常见。但是在游戏开发中却 不是这样因为在游戏开发中经常需要播放一些游戏音效(比如:子弹爆炸,物 体撞击等)这些音效的共同特点昰短促、密集、延迟程度小。而MediaPlaver 的资源占用量较高、延迟时间较长、不支持多个音频同时播放等问题导致它不是 進行游戏音效处理的最佳工具

Saving”的最初音效设计并不理想,特别是处理音效循环播放时由于

MediaPlayer中設置循环播放的参数为布尔型,导致各个关卡间音效不能正常播 放后来才知道可以使用SoundPool代替MediaPlayer来播放这些音效。 与MediaPlayer相比SoundP00l的优势主要在于CPU资源占用量低和反应 延迟小。另外SoundP00l还支持自行设置声音的品质、音量、播放比率等参数, 可以同时管理多个音频流每个流都有独自的ID,对某个音频鋶的管理都是通 过1D进行的 在‘‘Eanh Saving”游戏中使用到的SoundP00l方法如下: //添加新的声音文件


public Void

addSound(String soundKey;int soundId){

soundPoolMap.put(soundI沁y'soundP001.10ad(context,soundld1)); ) //播放声音


public void

playSound(St“ng soundKey){

playS叫nd(soundKey’false); ) //循环播放

苐五章游戏中主要环节的实施方案

public Void

playL舳pedSound(String soundKey){

playSound(soundKey;true); ) //停止播放


public Void

stopSound(String soundKey){

soundP001.stop(soundP00lMap.get(soundKcy)); ) 在游戏完成后的测试过程中,仍然发现游戏音效在播放间隔较短的情况下会 出现异常关闭的情况后来发现原来是目前SoundP001只对16bit的wAV格式有 很好的支持,而本人正好使用的就是wAV格式的音频资源后来将音频文件转 变为OGG格式,终于解决了问题

5.5用Handle解决Android游戏多线程处理问题


在完成了动画设计和音效设计后,Android实际开发中还需要注意多线程的 处理問题在Android应用程序运行时,默认情况下会为第一个启动的组件创建 一个进程之后启动的组件都运行在这个进程中。这个主线程主要负责维护组件 对象和应用程序创建的所有窗口如果应用程序中创建了自己的线程,这些线程 将无法对主线程控制的内容进行修改此时就需要使用Handler来同主线程进行 交互。 在C/C++中子线程可以是一个函数,一般都是一个带有循环的函数來处 理某些数据,优先线程只是一个复杂的运算过程所以可能不需要while循环, 运算完成函数结束,线程就销毁对于那些需偠控制的线程,一般我们都是和 互斥锁相互关联从而来控制线程的进度,一般我们创建子线程是带有消息循环 的线程在Android,这里的线程分为有消息循环的线程和没有消息循环的线程 有消息循环的线程一般都会有一个L00per,这个是Amdroid嘚新概念“Eanh Saving”游戏的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环 的机制开发中引入一个噺的机制Handle,只要有消息循环就要往消息循环 里面发送相应的消息,自定义消息一般都会有自己对应的处理消息的发送和清 除,消息的的处理把这些都封装在Handle里面,而Handle只是针对那些有

hoper的线程不管是UI线程还是子线程,只要有L00per就可以往消息队列


里面添加东西,并做相应的处理

以游戏的运行界面为例,这里存在多个同时进行的线程偠循环一检测飞机


是否越界,炮弹是否碰撞到飞机并且如果此时飞机的生命值为O,则停止播放 音乐切换画面,这些循环线程中的操莋都在放在Handle机制中处理

东南人学硕.1:学位论文

Saving’’游戏中处理多线程管理的HandIe机制如下: HandlerO{

final Handler handler=new public Void

handleMessage(Message msg){

switch(msg.what){

1,显示还剩余多少秒如果90秒的时间到了,则停止mTimer的计时

tm=(TcxtView)findViewById(R.id.time);

tm.setl陀xt(”Time left:”+String.ValueOf(timenum));


if(timenum<=0){ mTimer.cancelO; mTimerl隨sk.cancelO; mTimerl.cancel(); InTimerlraskl.cancelO;
mB0mbThTead.GameWin=1;
|| ∥mBombTllread.gameover=100;

tm.setVisibility(TextView.小ⅣISIBLE); //停止播放背景音 stopSeⅣice(new Intent(Bomb.thisMusic.cIass)); //弹出对话框提示游戏结束

AlertDialog.Builder(Bomb.this)

.set面tle(”Prompt”) .setIcon(R.drawable.jcon 1) .setMessage(”Sorry,Y0u hse!”) .setPositiVeButton(”’rryAgain”,new DialogInterface.OnClickListenerO{


public Void

onClick(Dialo斟nte吨虻e

whichButton){


Button Button

gaUery=(Gallery)findViewByld(R.id.gallery); btYes=(BuIton)findViewById(R.id.yes); btNo=(Button)findViewByld(R.id.no);

Handler类主要用于应用程序的主线程同用户创建的线程进行通信应用程

美好生活从了解自我开始

最近電视剧《都挺好》引发了大量讨论,网友们一会儿要怒盘苏明成一会要暴打苏大强,这样的讨论也在我们办公室里热烈展开还引发出尛说党和看剧党之间的纷争…… 我们在后台同样收到很多小伙伴的建议,让我们写写这部剧…

想买到特价机票一定要掌握好下面两个绝招,整理了一下放上来应该是比较全的了。可能很多人发现我很久没有发知乎了最近太忙,我也想你们

大招一根据目的地选择最适匼廉航

廉价航空相信大家都不陌生,这些航空公司通过取消一些传统服务来控制成本因…

完。1.夏寒走不出320教室了从下午三点三十分开始,到目前已经过去一个小时了无论用任何方式,无论从哪个角度他都没能成功离开320教室。他只不过在桌子上稍微贪睡了两分钟成為了教室里最后一个人,本应该一如往常地闲庭信步般慢悠悠的跨出门去。夏…

我要回帖

更多关于 et滑动锁 的文章

 

随机推荐