当前位置:文档之家› 基于Android操作系统的飞机大战手机游戏毕业设计40设计41

基于Android操作系统的飞机大战手机游戏毕业设计40设计41

(此文档为word格式,下载后您可任意编辑修改!)

石家庄科技信息职业学院

毕业论文

题目:基于Android操作系统的飞机大战手机游戏

姓名:魏铄

专业班级:软件技术(游戏方向)09-24 班

指导教师:刘永伟

1

摘要: 飞机大战是滚动屏动作类游戏的一种,其中融入了很多动作类游戏特有的技术,并且画面流畅、声音震撼。

当今网络发展迅速,益智类游戏被广泛运用到网络各大平台上。借鉴网络各大平台上的游戏,通过Eclipse Android SDK 利用Java语言编写的《飞机大战》。

本文阐述了在Android平台上,面向对象的软件开发思想对飞机大战游戏系统的分析、设计及实现过程。在项目的实践过程中,主要用到了以下技术:手机布局主要使用了XML设计,程序及其子模块的生命周期管理用到了Activity流程控制,游戏的画面更新使用的是手机的2D图形编程。本论文的前半部分将简要介绍系统相关的行业信息及基础的技术知识,后半部分将对本人在系统各模块中所使用的关键技术的实现进行了全面的介绍。

关键词:滚屏游戏;飞机大战;手机游戏;Android平台

Abstract: the World War II aircraft rolling screen action game one, incorporating many action games unique technology, and smooth picture, sound rock.The network is developing rapidly, a puzzle game is widely applied to the network the platform. From the network the platform game, through the Eclipse Android SDK Java language prepared by the" World War II aircraft". This paper elaborated on the platform of Android, object-oriented software development thought to the World War II aircraft game system analysis, design and implementation process. In the practice of the project process, the main use of the following techniques: the layout of the main mobile phone using XML design, procedures and sub module life cycle management used in the Activity process control, the game screen is updated using the mobile phone 2D graphics programming. In this paper, the front of system related industry information and basic technical knowledge, the second part of the each module of the system used in the realization of the key technology for a comprehensive introduction.

Key words:scrolling game; World War II aircraft; mobile phone games; Android platform

目录

一、绪论 (5)

二、相关研究综述 (6)

(一)关于java语言 (6)

(二) 关于Android (8)

三、系统开发环境及相关技术 (10)

四、游戏所需类的分析与实现 (11)

(一)游戏的框架简介 (11)

(二)游戏界面的框架简介 (12)

(三)各个类的简要介绍 (13)

五、游戏界面展示 (22)

总结 (27)

致谢 (28)

参考文献 (29)

前言

随着3G移动网络应用的推广,手机游戏的规模、复杂程度日益增强;其技术手段、设计思想、系统体系结构都发生了深刻的变化。手机操作系统正朝着高处理能力、多功能、智能化的方向发展。近年来,网络文化市场发展很快,随着互联网的迅速普及、宽带的接入社区和家庭,我国网络游戏市场发展迅速并进入了一个高速增长期,并已经创造了较大的产值,带动了相关产业的发展。

现在,游戏的类型也由最初的动作游戏和简单益智游戏向更复杂、更高智力,更具真实性的游戏发展。目前的游戏种类繁多,包括角色扮演、仿真模拟类、人工智能、休闲类、渲染类、网络类等等,甚至有的游戏包含了好几种类型。

机战类游戏一直以来都很多。但仿真模拟类的游戏却有不少,现在休闲类的技术广泛的应用到很多游戏里面等等。

飞机大战游戏是广泛人士喜爱的游戏,通过上下左右键控制方向A键发射子弹,

游戏中有加血道具与子弹升级道具。并有关卡BOSS等着与你死战。

鉴于游戏的对社会的巨大影响力和光辉的发展前景,以及我们自己对游戏爱好,这次的毕业设计我们决定尝试设计和制作一个具有一定可玩性的游戏。期间,我们收集相关资料、研究同类型的游戏、阅读有关这类型游戏和相关技术性的书籍,通过制作游戏项目来熟悉游戏的制作思路、过程,加深对面向对象编程语言的掌握,培养自己的耐心、细心和考虑问题的全面性,同时解决本课题要完成的问题,如游戏框架如何构建,如何完善游戏的各种功能,如何能让游戏有音乐和音效的实现,如何能让游戏过关,如何能让游戏界面美观,看起来舒服感觉。

一、绪论

1.1 研究内容

Android平台飞机大战是基于Android手机平台,运用Java语言编写的一款手机滚屏类射击游戏。

1.2 研究意义

Android平台手机游戏的开发的意义在于活动人的思维,使人精神放松,锻炼人的反应能力与应变能力。

1.3研究现状和发展趋势

据Gartner最新数据显示,2010年第二、三季度全球智能手机销售继续大幅增长,其中第三季度安卓占全球智能手机市场的25.5%,仅次于塞班,成为第二大智能手机系统。2010第二、三季度与去年同期相比,增度分别是15.4%及22%,增势迅猛。而塞班系统较09年的市场份额,尽管终端销量有大幅度提升,但增势下滑10%,形势非常严峻。其他操作系统的表现则要平稳很多。

安卓是首款开源代码的操作系统,采用Linux内核,开放手机联盟(OHA)成员

可以任意使用和修改安卓的SDK软件包。系统的开源性使其具有良好的拓展性,一方面,为众多移动应用开发者提供了良好的系统性平台,有利于移动应用的集合;另一方面,终端厂商可以针对自身的特殊需要“定制化开发”。与此相比,尽管2010年2月,塞班基本完成开源工作,但由于代码臃肿,用户界面设计缺失,塞班的开源并无实际意义,错失发展良机。

我们认为,安卓在全球市场的成长壮大,塞班市场份额不断下跌已成不争事实。安卓操作系统发展迅猛主要得益于免费、开源和良好产业运作策略,这三点为安卓在智能手机市场赢得更多的发展机遇。系统的免费让更多的厂商加入,推动了份额的上升;代码的开源让更多的开发者进入应用开发;应用的丰富吸引了更多用户选择,这也是谷歌值得众多厂商学习的地方。此外,谷歌通过OHA联合众多厂商进行系统研发,不断更新版本,将系统应用推广到更多的终端产品中,确保用户体验持续改善。

二、相关研究综述

2.1关于java语言

Java编程特点

1、Java语言是简单的。Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。

2、Java语言是一个面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++ 语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。

3、Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java 的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

4、Java语言是健壮的。Java的强类型机制、异常处理、废料的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。

5、Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。

6、Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java 平台上被编译为体系结构中立的字节码格式(后缀为class的文件), 然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。

7、Java语言是可移植的。这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。

8、Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java 平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。

9、Java是高性能的。与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。

10、Java语言是多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable) 的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。

11、Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环

境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。

Java语言的优点

1 java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了。Java语言的简单性主要体现在以下三个方面:1.Java的风格类似于C++,因而C++程序员是非常熟悉的。从某种意义上讲,Java语言是C及C++语言的一个变种,因此,C++程序员可以很快就掌握Java编程技术。2.Java摒弃了C++中容易引发程序错误的地方,如指针和内存管理。3.Java提供了丰富的类库。

2 面向对象可以说是Java最重要的特性。Java语言的设计完全是面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。Java支持静态和动态风格的代码继承及重用。单从面向对象的特性来看,Java类似于SmallTalk,但其它特性、尤其是适用于分布式计算环境的特性远远超越了SmallTalk。

3 另外,为了建立Java作为网络的一个整体,Java将它的程序编译成一种结构中立的中间文件格式。只要有Java运行系统的机器都能执行这种中间代码。现在,Java运行系统有Solaris2.4(SPARC),Win32系统(Windows95和WindowsNT)等.Java 源程序被编译成一种高层次的与机器无关的byte-code格式语言,这种语言被设计在虚拟机上运行,由机器相关的运行调试器实现执行。

2.2关于Android

2.2.1 android构架

Android作为一个移动设备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上分为以下几个层次:

图2.2 Android系统架构

2.2.2 XUL界面布局

XUL 是一种基于 XML 的语言,因此需要对 XML(特别是 XML 名称空间)很熟悉。XUL是英文“XML User Interface Language”的首字母缩写。顾名思义,它是一种应用XML来描述使用者界面的标示语言。

2.2.3 Android的Activity组件

Activity,一般代表手机屏幕的一屏,相当于浏览器的一个页面。在Activity 中添加view,实现应用界面和用户交互。一个应用程序一般由多个Activity构成,

这些Activity之间可互相跳转,可进行页面间的数据传递。每个Activity都有自己的生命周期。

2.2.4 SQLite数据库

在Android平台上,集成了一个嵌入式关系型数据库—SQLite。SQLite是支持结构化查询的轻量级数据库,能很好得适应于移动设备的应用。

Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。

2.2.5 Android 2D图形编程

1、Simple Graphics in View:就是直接使用Android已经实现的一些画图操作,比如说images,shapes,colors,pre-defined animation等等。这种方式只能画静态或者极为简单的2D图画,对于实时性很强的动画,高品质的游戏都是没法实现的。

2、Canvas:首先我们要明白这个Canvas是一个2D的概念,是在Skia中定义的。也就是说在这个方式下还是说的画2D图形。

三、系统开发环境及相关技术

3.1 Android开发环境介绍

Android的上层应用程序是用Java语言开发,同时还需要基于Dalvik虚拟机,所以,Google公司推荐使用主流的Java继承开发环境Eclipse。只有Eclipse还不够,因为是使用Java语言进行开发,还应该有由SUN公司提供的Java SDK(其中包括JRE:Java Runtime Environment)。此外,Android的应用程序开发和Java开发有较大区别的,所以还需要有Google提供的Android SDK。同时,还需要在Eclipse 安装ADT,为Android开发提供开发工具的升级或者变更,是Eclipse下开发工具的升级下载的工具。

(1) Java SDK

(2) Eclipse

(3) Android SDK

3.2 Android开发平台搭建

Android开发平台搭建步骤:

①首先到下载Eclipse集成开发环境并且解压,这里推荐下载Java EE 集成版本,可以为平台的搭建省下不少工作。接着再去站点下载SDK后安装,下载,Android

SDK1.5后解压。第一步下载工序就结束了。

②双击Eclipse解压后目录中的eclipse.exe然后启动,选择Eclipse菜单中的Help-> Install New Software-> 选项卡上的Available Software,点击右侧的“Add”输入后确定,然后在“Work with”下拉菜单中选择刚才输入的网址。过一会就会出现一个Developer Tools选项,勾上以后点击Next以后Eclipse会自动网上查找Android 开发工具插件,然后找到Android DDMS和Android Development Tools,选中这两个点击Finish,Eclipse就会自动下载并安装Android插件了,最后会提示重启Eclipse。

③重启后选择Eclipse菜单中的Windows-> Preferences 在左侧的Android项目中SDK Location中填入Android SDK解压后的目录,然后点击Apply。

④ 在WindowsXP的系统变量中的path变量中添加一个值,该值指向解压后

的Android SDK目录下的tools文件夹。

四、游戏所需类的分析与实现

4.1 游戏的框架简介

图4.1 游戏的类框架

1、启动游戏,在PlaneActivity中会先进入加载界面ProcessView,然后后台加载欢迎界面WelcomView,当加载完成后屏幕切换到欢迎界面,并启动WelcoeViewThread 线程生成欢迎界面的动画效果。

2、当欢迎动画播放完成后屏幕会停留在选择状态等待玩家操作。

3、当玩家单击“帮助”时将初始化帮助界面HelpView并将其显示出来。

4、当玩家大几“开始游戏”按钮时,屏幕将显示加载界面。后台将初始化游戏界面GameView,在地图信息类Maps中初始化此关卡中的所有敌机、变枪的道具、补血的道具等。

5、初始化游戏界面的同时启动GameViewBackGroundThread线程,以初始滚动游戏界面的背景图片。

6、当玩家发射炮弹或敌机发射炮弹时会创建Bullet对象,并将其添加到已知的容器中。

7、在游戏过程中如果需要显示爆炸效果,会创建爆炸效果类Explode以及ExplodeThread类来渲染爆炸效果。

8、游戏中所有类中使用的常量全部封装到常量类ConstantUtil类中。

4.2 游戏界面的框架简介

图4.2 游戏界面的类框架

1、GameView在初始化是会从Maps读取当前关卡的地图信息,包括敌机、补血道具、换枪道具等。

2、在界面初始化的同时,还需要启动MoveThread线程、

GameViewBackGroundThread线程、KeyThread线程以及ExplodeThread线程。

3、GameView会在适当的时候从Plane类中读取主战飞机的信息进行绘制。

4、当主战飞机发射子弹时,会创建Bullet对象并添加到指定容器中,此时MoveThread同样需要定时改变子弹对象的位置。

5、在以上过程中,全部都需要PianeActivity的管理与ConstanUtil的参与。

4.3各个类的简要介绍

1、共有类:

Activity的实现类PlaneActivity,该类是通过扩展基类Activity实现的,是整个游戏程序的入口。

键盘监听线程KeyThread,该类为手机键盘的监听线程,每隔一段时间读取一次键盘的状态值,并根据当前键盘状态做出相应的操作

package wyf.ytl;

public class KeyThread extends Thread {

int span = 20; 睡眠的毫秒数

int countMove = 0; 飞机移动的计数器

int countFine = 0; 飞机发子弹的计数器

int moveN = 3; 每三次循环移动一下

int fineN = 5; 每五次循环发一次子弹

PlaneActivity activity; Activity的引用

private boolean flag = true; 循环标志

int action; 键盘状态码

private boolean KEY_UP = false; 向上键是否被按下

private boolean KEY_DOWN = false; 向下键是否被按下

private boolean KEY_LEFT = false; 向左的键被按下

private boolean KEY_RIGHT = false; 向右的键被按下

private boolean KEY_A = false; A的键被按下

private boolean KEY_B = false; B的键被按下

public KeyThread(PlaneActivity activity) { 构造器

this.activity = activity;

}

public void setFlag(boolean flag) { 设置标志位

this.flag = flag;

}

public void run() { 重写的方法

while (flag) {

action = activity.action; 得到当前键盘的状态码

if (action == 19) { 上

KEY_UP = true;

} else {

KEY_UP = false;

}

if (action == 20) { 下

KEY_DOWN = true;

} else {

KEY_DOWN = false;

}

if (action == 21) { 左

KEY_LEFT = true;

} else {

KEY_LEFT = false;

}

if (action == 22) { 右

KEY_RIGHT = true;

} else {

KEY_RIGHT = false;

}

if (action == 29) { A

KEY_A = true;

} else {

KEY_A = false;

}

if (activity.gameView.status == 1 || activity.gameView.status ==

3) {

if (countMove == 0) { 每moveN次移动一次

if (KEY_UP == true) { 向上键被按下

检测在不碰到上边界的情况下

if (!((activity.gameView.plane.getY() - activity.gameView.plane

.getSpan()) < ConstantUtil.top)) {

向上移动10个像素

activity.gameView.plane

.setY(activity.gameView.plane.getY()

-

activity.gameView.plane.getSpan());

}

通过dir更换图标

activity.gameView.plane.setDir(ConstantUtil.DIR_UP);

}

if (KEY_DOWN == true) { 向下键被按下

if (!((activity.gameView.plane.getY() + activity.gameView.plane

.getSpan()) > ConstantUtil.screenHeight

-

activity.gameView.plane.bitmap1.getHeight())) {

activity.gameView.plane

.setY(activity.gameView.plane.getY()

+

activity.gameView.plane.getSpan());

}

activity.gameView.plane.setDir(ConstantUtil.DIR_DOWN);

}

if (KEY_LEFT == true) { 向左键被按下

if (!((activity.gameView.plane.getX() - activity.gameView.plane

.getSpan()) < -40)) {

activity.gameView.plane

.setX(activity.gameView.plane.getX()

-

activity.gameView.plane.getSpan());

}

}

if (KEY_RIGHT == true) { 向右键被按下

if (!((activity.gameView.plane.getX() + activity.gameView.plane

.getSpan()) > ConstantUtil.screenWidth

- activity.gameView.plane.bitmap1.getWidth())) {

activity.gameView.plane

.setX(activity.gameView.plane.getX()

+

activity.gameView.plane.getSpan());

}

}

水平态

if (KEY_RIGHT == false && KEY_LEFT == false

&& KEY_DOWN == false && KEY_UP == false) {

activity.gameView.plane.setDir(ConstantUtil.DIR_STOP);

}

如果按下a键发射子弹

if (countFine == 0) { 每fineN发一次子弹

if (KEY_A == true) { A键被按下

activity.gameView.plane.fire();

}

}

}

countMove = (countMove + 1) % moveN;

countFine = (countFine + 1) % fineN;

}

try {

Thread.sleep(span); 睡觉指定毫秒数

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

常量类ConstantUtil,游戏中用到的所有的常量全部封装到该类中,便于管理与维护。

2、辅助界面相关类

欢迎界面WelcomeView,该类为游戏欢迎界面的实现类,主要负责欢迎界面的绘制工作。

欢迎界面的动画实现类WelcomeViewThread,该类是为WelcomeView服务的线程类,主要负责欢迎界面中动画的生成。

帮助界面HelpView,该类非常简单,主要负责绘制帮助界面的相关图片。

加载界面ProcessView,为了使游戏更加人性化,给玩家更好的体验,在长时间加载某些资源时,需要给出加载界面以提示玩家后台加载的进度。

胜利界面WinView,该类为玩家顺利过关后的恭喜过关界面。

失败界面FailView,该类为主战飞机死亡后显示的失败界面,在该界面中玩家可以选择重新开始游戏或者退出游戏。

3、游戏界面相关类

游戏主界面类GameView,该类为游戏菜单界面的实现类,负责界面绘制工作。

背景滚动线程GameViewBackGroundThread,该类主要负责背景的滚动、敌机以及各种道具的出现。

package wyf.ytl;

**

*

* 该类为背景滚动、物品出现的类

*

*

public class GameViewBackGroundThread extends Thread { private int sleepSpan = 100; 睡眠的毫秒数

private int span = 3; 图片移动的步长

private boolean flag = true; 循环标志位

GameView gameView; GameView的引用

long touchTime = 0; 当前所到的时间

public GameViewBackGroundThread(GameView gameView) { 构造器this.gameView = gameView;

}

public void setFlag(boolean flag) { 设置标记位

this.flag = flag;

}

public void run() {

while (flag) {

if (gameView.status == 1) { 游戏中时

gameView.backGroundIX -= span;

if (gameView.backGroundIX < -ConstantUtil.pictureWidth) {

gameView.i = (gameView.i + 1) % ConstantUtil.pictureCount;

gameView.backGroundIX += ConstantUtil.pictureWidth;

}

gameView.cloudX -= span; 移动云彩

if (gameView.cloudX < -1000) {

gameView.cloudX = 1000;

}

touchTime++; 时间自加

滚动地图的时候

try {

for (EnemyPlane ep : gameView.enemyPlanes) { 到时间出现敌机

if (ep.touchPoint == touchTime) {

ep.status = true;

if (ep.type == 3) { 到关口了

gameView.status = 3;

}

}

}

for (Life l : gameView.lifes) { 到时间出现血块

if (l.touchPoint == touchTime) {

l.status = true;

}

}

for (ChangeBullet cb : gameView.changeBollets) { 到时间出现吃了改变枪的物体

if (cb.touchPoint == touchTime) {

cb.status = true;

}

}

} catch (Exception e) { 捕获异常

e.printStackTrace(); 打印异常信息

}

一分多钟后游戏结束

if (touchTime == 641) { 到关口时

this.flag = false;

}

}

try {

Thread.sleep(sleepSpan); 睡眠

} catch (Exception e) { 捕获异常

e.printStackTrace(); 打印异常信息

}

}

}

}

地图信息Maps,该类包含着地图的相关信息,例如敌机所有的移动路线、各个关卡中补血道具、换枪道具等。

物体的移动线程类MoveThread,该线程负责除了我方主战飞机外所有可移动物的移动。

4、情景相关类

主战飞机Plane,该类为主战飞机的封装类,可由玩家控制其方向以及移动状态。

敌机EnemyPlane,该类为敌机的封装类。

子弹类Bullet,子弹的封装类,游戏中所有的子弹都为该类的对象。

爆炸效果类Explode,该类为爆炸效果的渲染类,负责在指定位置绘制爆炸效果。

爆炸换帧线程Explode,该类是为爆炸效果类服务的,当爆炸存在时定时为每个爆炸效果换帧。

补血道具类Life,该类为补血道具类,当主战飞机与该类对象碰撞时,会为主战飞机增加一格血。

换枪道具类ChangeBullet,该类为换枪道具类,当主战飞机与该类对象碰撞时,会增强主战飞机所携带的武器。

五、游戏界面展示

1、主界面

图5.1主界面 2、游戏界面

图5.2游戏界面3、射击

相关主题
文本预览
相关文档 最新文档