基于java的雷电(飞机大战)游戏
摘 要
电脑游戏,是指在计算机上能够运转的游戏软件。这种软件具有较强的娱乐性。电脑游戏的创新和发展与硬件、软件的发展紧密相关。它能够给玩家提供一个虚拟的环境,使游戏带给了人们很多的享受和欢乐。雷电游戏因为操作简单,节奏明快,一直是纵轴射击游戏的经典之作。经常能够在手机或者计算机中见到这款游戏,深得广大玩家的喜爱,可以说是妇孺皆知的一款益智类游戏。
本游戏基于Eclipse开发平台,以java作为编程语言,整个项目开发旨在模拟雷电游戏的飞机射击游戏。游戏界面的下部是玩家的飞机,可以根据按键控制子弹的发射,上部为敌方飞机,在界面中随机出现。在游戏过程当中,用户飞机的移动是被电脑键盘的方向键所控制的,在整个游戏过程当中,如果用户飞机的子弹与敌方飞机发生相撞时,敌方飞机就会有爆炸的效果产生。游戏中使用到的飞机、子弹均采用对应的类实现。
关键词:雷电;电脑游戏;java;Eclipse;
目 录
摘 要 I
Abstract II
1 引言 3
1.1 项目背景 3
1.2 电脑游戏的发展历史 3
1.3国内游戏项目研究现状 5
1.4项目主要工作 6
1.5本文组织结构 7
1.6 电脑游戏的策划 7
2 开发平台与开发技术 8
2.1 Eclipse 8
2.2 Eclipse平台 8
2.3 Java 9
2.4游戏图形界面的开发基础 11
2.5Java游戏中的基本框架 14
3 雷电游戏模块设计 16
3.1 用户需求分析 16
3.2 可行性分析 16
3.3 总体设计原则 17
3.4 功能模块设计 18
3.4.1 游戏状态控制功能 18
3.4.2 游戏难度的调整 18
3.4.3 游戏界面绘画功能 18
3.4.4 玩家游戏控制功能 19
3.5 关键技术 19
4 雷电功能实现 20
4.1 游戏程序设计的思路 20
4.1.1 游戏的素材选择 20
4.1.2 游戏中子弹、飞机的实现 20
4.1.3 多线程应用的途径 20
4.2 游戏首页的实现 22
4.2.1 界面实现 22
4.2.2 流程图 22
4.2.3 核心代码 23
4.3 游戏开始模块的实现 24
4.3.1 界面实现 24
4.3.2 流程图 25
4.3.3 核心代码 26
4.4 发射子弹模块的实现 27
4.4.1 界面实现 27
4.4.2 流程图 28
4.4.3 核心代码 28
5 系统测试 31
5.1 测试的定义及其重要性 31
5.1.1 测试的定义 31
5.1.2 测试的重要性 31
5.2 测试实例的研究与选择 32
5.3 测试结果 35
总结和展望 37
参考文献 38
致 谢 39
1 引言
1.1 项目背景
作为90后的我们,在小时候都拥有属于自己的一台游戏机,里面形形色色大概有十来款游戏。像 “扫雷”、“推箱子”、“俄罗斯方块”等等,我们的童年有这些游戏陪伴我们是幸福的,令许多小伙伴都为之痴迷,即使现在,这些都是随处可见的休闲游戏。我之选择“雷电”游戏作为我的毕业设计,因为它可以代表一代人青春的回忆。
Java语言,实际上就是面向对象的编程语言。对于计算机编程者来说,使用Java最大的好处有两方面,一是就编写程序而言,非常的简单也容易使用,二是它的功能很强大。与此同时,面向对象理论得以很好的实现。“雷电”游戏的毕业设计使我对本科期间所学知识进行了巩固。
目前常见的电脑游戏的类型有动作游戏、传统益智游戏、体育游戏、策略游戏、休闲游戏和角色扮演类游戏等。不同的类型的游戏有着自身的特点,每一种类型的游戏都有一定的支持人群。开发出一款良好的游戏,了解各种类型的基本特点是很有必要的。而“雷电”游戏就属于上述类型中的STG(射击类)游戏,STG(Shooting Game)类型游戏主要凭借远程武器与敌方开展模拟对抗,拥有绚丽的射击画面。
这个项目使我第一次全流程地独立完成整条链路的开发,对于我自己而言,是0-1的突破。万事开头难,有了这次完整项目开发的经历,以后再做游戏或者其它项目时就对全局有所把控,能够做到游刃有余。假如自己没有亲自动手设计这些,哪怕一次,就不能够真正的领会一个完整项目体系中的每个元素。在以后做一些大的项目时,就更不能对整体进行宏观思考,也就不能对具体项目中每一个细分的小模块进行合适的时间估计,导致项目开发超过预期时间,更有甚,不能完成。
1.2 电脑游戏的发展历史
在1960年,电子计算机进入了美国的大学校园,这时候电脑游戏开始出现。在那个环境当中孕育了一大批的电脑编程高手。其中具有代表性的是1962年一名叫做拉塞尔的大学生,在美国DEC公司生产的PDP-1型计算机上编写的《宇宙战争》引起了广泛的关注。所以大多数人都把拉塞尔称作电脑游戏的发明人。从1970 年以后,计算机的发展速度逐渐加快,同时开发的成本逐步降低。再后来,布什内开发了世界上首台商业化计算机用以游戏用途,被称为“电子游戏之王”。
1970年,随着苹果公司的诞生,使得电脑游戏开始越来越商业化。不过,早期的电脑游戏界面设计等较为粗糙,但是电脑游戏的雏形已经诞生。
1980年,随着多媒体技术渐渐走向成熟,技术先进的先行者们纷纷把目光投向电脑游戏。每一款游戏都会有详细的故事情节作为描述,1985年,日本公司任天堂开发了一款电子游戏巨作—超级马里奥,它讲述的情节是一名在意大利的管子工击败了大魔王,最终迎娶了公主也拯救了世界。这款游戏的流行程度也确立了任天堂公司在电子游戏界的称霸地位。这款游戏尽管叫做Computer,但它专心于游戏机平台的营造,舍弃了一部分计算机特征。从此以后,游戏机游戏和电脑游戏开始分道扬镳。Windows操作系统出现以后,电脑游戏的设计开始了一场新的革命,电子游戏的设计者越来越注重视觉和感官的冲击,开始向3D的方向发展。从3D Realms公司的《德军总部3D》到Id Software公司的《Doom》,电子游戏开始商品化。
1996年,《Quake》成为一款跨时代的游戏作品,相比于之前的其它射击类游戏,它是一款真正的3D游戏,给玩家带来了前所未有的虚拟真实感。《Quake》代表了计算机游戏开始渐渐向3D门槛迈入,也同时给电竞活动带来了全新的概念。
从1990年开始,即时战略游戏成为电脑上最引人关注的游戏类型。比如Westwood公司开发的《红色警戒》和《C&C》,还有《帝国时代》和《星际争霸》等等,伴随着五花八门的游戏概念的不断提出和创新,即时战略游戏的发展达到了一个新的高度。在此同时,由于3D技术的不断进步,动作游戏也获得了新生,伴随游戏的发展,动作游戏的规则也产生了一些改变,原来在2D平面上运行的动作游戏无法将一些真实的动作表现出来,而3D技术的革新,使得人物不仅前后左右运动,而且可以通过自己的视角进行观察周围环境,创造出新的动作。再到后来,随着计算机在软、硬件方面技术的进步,给电脑游戏的发展带来了强劲的动力和机遇。
21世纪以来,电脑游戏开始在网络游戏方面崭露头角。与单机版游戏不同,网络游戏的玩家需要通过连入互联网来进行游戏。所以说,网络游戏必须有用户玩家接入互联网,按照开发过程中制定的规则进行操作。其中,按照游戏形式的差异,可以分为网页游戏和客户端游戏。网页游戏是指用户不需要提前安装客户端软件,就可直接通过网络浏览器来玩的网络游戏。它所具有的优点是不会存在硬件配置不够的问题,而且开启以及关闭都很方便。网页游戏的题材和类型也都非常丰富,具有代表性的有休闲竞技等。客户端网络游戏需要预先在电脑上安装客户端进行注册自己的唯一账号,这种形式的游戏由开发该游戏的公司进行构建服务器,如今的大部分游戏都是这种类型。每个玩家在一开始都会创建自己的角色,并且这些资料都会保存在服务器端。具有代表性的游戏作品有英雄联篮球部落、魔兽世界、穿越火线、跑跑卡丁车等。
1.3 国内游戏项目研究现状
现在市场上的电脑游戏形形色色,种类杂多。而且游戏程序的设计工具也不相同。大体上包括四类:
一,利用C/C++程序设计语言,大多数大中型游戏都是将C/C++作为程序设计语言开发。C/C++所拥有的特点有运行时速度较快。
二,利用Java程序设计语言。Java程序设计语言在游戏制作方面的优势较为显著,不过这仅仅是相对于小游戏而言的,对于大型网络游戏,使用Java程序设计语言在速度方面的劣势就会越加突显。比较著名的Java语言开发工具有Sun 公司的NetBeans等。目前Java程序设计语言关于游戏的优势领域包括:基于Applet的网页游戏和手机游戏。在当前的手机游戏市场中,平台主要有Android(安卓)、iOS(苹果)、Java平台和Windows平台等。其中,iOS平台由于终端数量限制导致增长较慢,相反,Android平台以其普及度较高的平台终端正处于爆发式的增长期,此外,大多PC上开发的Java游戏也可以移植到Android智能手机平台上。
三,FlashActionScript是一种脚本语言,经常在Flash文件中进行嵌入,主要是对Flash动画流程进行控制。使用FlashActionScript语言设计出的游戏内存较小、画面逼真,因此在小游戏的设计领域迅速走红。2D平面游戏都可以用Flash编写。比如Adobe公司的Flash CS产品。
四,C#程序设计语言是由Java和C++衍化来的程序语言,拥有Java和C++的双重优点,既能够用以面向对象程序设计,同时在运行的速度方面具有较大优势。
现如今,Java语言在游戏开发环节,也正逐步展现出它独有的特色。
1.4 项目主要工作
本次项目开发是基于JAVA的雷电游戏。
此雷电游戏通俗来说就是我方飞机和敌方之间的对决,先要做的应该是通过一个界面来达到装载整个游戏,然后就是我方飞机的移动方式(也就是通过键盘来移动),接着就是生成我方飞机的子弹(依据子弹类型的不同有不同的实现形式),准备就绪后会有敌方飞机的出现,每一个飞机会对应发射不同种类的子弹,最后是我方飞机通过键盘进行移动、射击,显示出游戏结果,然后结束游戏。
该雷电应该满足以下一些要求:
(1)游戏状态控制功能
在进行游戏的设计时,我们应该考虑到,如何进行游戏状态的划分。简单来说,我们需要设置开始,并且要考虑到游戏中断,以及中断后回到游戏中。玩家点击开始之后,程序会调用启动页面的代码,然后进入游戏,在游戏的过程中,玩家如果由于其它工作需要离开时,可以将其中断,比如单击空格键,当需要恢复游戏现场时,再单击空格键,就可以继续游戏,当自己控制的飞机被击毁时,会有游戏结束的显现。
(2)游戏难度的调整
随着游戏的进行、关卡的提高,敌机的速度会越来越快、敌方飞机的数目会越来越多、子弹数量也会越快且越多。此时,带给游戏玩家的视觉冲击变得更强,需要玩家更加冷静地去躲闪以及攻击敌机。
(3)游戏界面绘画功能
游戏主屏主要用来输出用户对我方的控制与敌方的动作显示。在游戏屏幕的左下角有全屏爆破次数的显示,这相当于游戏玩家的特殊技能,可以瞬间清除当前屏幕上的所有敌机以及子弹,在游戏屏幕的右下角会呈现玩家飞机血条,代表着当前我方飞机的状态。当血条格为空时,表示我方飞机已经被击毁,整个雷电游戏也将结束。
(4)玩家游戏控制功能
对于我方飞机的移动和子弹的发射,游戏用户可以通过控制键盘来控制。飞机的左右移动通过键盘的上、下、左、右键来实现,而我方飞机子弹的释放方式有两种,z键会释放出点状子弹,而x键会释放出线状子弹,可供游戏玩家依据需要自行选择。
1.5 本文组织结构
文本的具体内容和组织结构简述如下:
第一章,本论文的研究项目和研究背景。
第二章,此项目的开发语言以及编程环境。
第三章,用户的需求分析,可行性分析,功能模块设计以及总体原则。
第四章,实现了雷电游戏的功能模块,对雷电游戏项目过程中的核心部分进行了代码的注解。
第五章,对实现的程序进行了测试,对整个项目做了功能评价。
1.6 电脑游戏的策划
策划主要就是对游戏的整体进行规划的工作,即在整个项目开始编写之前,要对雷电游戏的开发过程进行规划,要做到心中有数。好比在阅读一本新书时,要先通过阅读全书的目录章节对全书进行整体的了解。策划的具体工作是对游戏的整体模式进行设计,同时也要对游戏设计文档进行描述。策划的范围包括整个游戏的所有内容,此外,游戏素材需提前制作,使得游戏中的各种要素能够呈现在我们面前。而程序开发的过程则是按照策划阶段设计的游戏规则运用代码的方式加以实现。游戏的筹划通常分为:数值策划、剧情策划、关卡策划等。
基于Java的雷电游戏属于飞机射击类游戏。在游戏策划中包括关卡的设计,这一过程需要程序的实现同时配合美术资源的制作。而且,也需要根据整个任务系统的框架进行任务书的编写。
2 开发平台与开发技术
本章主要介绍该毕业设计项目所使用的开发语言和开发平台。
2.1 Eclipse
Eclipse是有名的跨平台自由集成开发环境(IDE),在最开始的时候,它作为一种开发工具,主要是为Java语言服务的,但近年来,随着各种插件的出现,它开始支持各种各样的语言,比如PHP以及C++等等。就Eclipse本身来说,它只是为开发者提供一个平台而已,但是随着各式各样插件的出现,使得Eclipse拥有较强的灵活性。许多软件开发商在Eclipse框架之上开发自己的IDE。Eclipse最吸引人的三个方面包括:一是创新性的图形API-SWT/JFace。与Java的 AWT/SWING界面不够美观、界面响应速度较慢相比,SWT/JFace极大改善了Java在这些方面的能力。二是插件机制。Eclipse以其强大的插件机制而著名,可以认为,Eclipse就是由众多的插件所组成的。到了Eclipse3.0,伴随RCP概念的推广,整个Eclipse的插件形成了清晰明了的层次关系。三是基于Eclipse插件机制开发的各种功能强大的插件。Eclipse插件的安装方法包括:直接复制法、Eclipse自带图形界面安装、使用link文件法、使用dropins安装插件等。
2.2 Eclipse平台
Eclipse是基于JAVA的可扩展开发平台。目前Java开发领域的集成开发环境层出不穷,种类达到10余种。如此多种类的IDE丰富了Java开发工具家族,但也为开发人员提出了选择难题。
这些开发模式区别较为显著,在一种开发模式下完成的项目往往不能方便地移植到另一种模式中,这就需要更加合理有效地选择适合项目目标的开发工具。
在目前的集成开发环境中,Eclipse可以说是最具发展前景的产品之一。Eclipse最早开始于1994年4月,由IBM、OTI的产品开发组创建。IBM提供了最初的Eclipse基础代码,包含JDT、Platform、PDE等。目前Eclipse项目已发展为一个庞大的Eclipse联盟,该联盟以IBM为主,有150多家软件公司参与其中,包括Borland、Software、Red Hat、Rational、Sybase等,最近Oracle也着手加入Eclipse联盟中。
2.3 Java
在目前的软件开发中,Java语言成为大部分人员的选择,甚至会有用户自己提出运用Java语言进行开发,可见Java语言的发展已经是深入人心,Java的流行是由于自身所拥有的特点所决定的。
(1)平台无关性
平台无关性是Java语言所拥有的最大优势,在Java中,源文件不是直接被编译成硬件可以识别的机器指令,而是通过Java的编译器先编译成字节码文件,该字节码文件就是编译Java源程序时得到的class类文件。Java的跨平台主要是指字节码文件能够在任意软硬件平台上运行,而执行这种类文件的就是Java虚拟机。Java虚拟机是指软件模拟出的计算机,可以执行编译Java源文件得到的中间码文件,而各种平台的差异就是通过Java虚拟机进行处理。
在JAVA中,通过Java虚拟机把中间码文件解译成目标平台能够识别的机器指令,能够实现不同平台运行Java程序。Java依据不同的环境平台提供了不同的Java虚拟机,例如在Sun的官方网站中就提供了windows、Linux和Solaris等各种版本Java虚拟机的下载。
(2)安全性
在C/C++中,指针的使用是一个高级话题,如果熟练掌握指针可以给程序的开发带来很大的方便,但是若使用指针不当,就有可能造成系统资源泄露,更严重的是错误的操作可能导致非法访问系统文件的地址空间,从而给系统带来灾难性的破坏,因此上在C/C++中指针的使用需要十分注意。在Java中,不存在这样指针,所有的存取过程都根据Java语言自身进行解决完成,不涉及对存储空间之间访问的方法,这样可以确保地址空间不被故意或者是无意的破坏。并且经过这种处理,也可有效避免系统资源的泄露。
例如在C/C++中,如果大量的指针不及时处理,就会占用系统内存资源,导致可用的内存空间被白白消耗掉。在Java中就不存在这样的麻烦,Java提供了一套行之有效的资源回收策略,可以使不再使用的系统资源自动回收,从而确保了系统资源的稳定性、安全性。另外,Java虚拟机会将Java程序内的数据资源及代码规范在特定的内存区域之中,确保Java程序不会破坏系统的内存空间,从而保证了系统的安全性。
(3)面向对象
面向对象已经成为目前软件开发中的首选,在Java中利用了不同面向对象语言的长处,从而更彻底的实现了面向对象的技术。Java程序大体上所有的功能都是基于对象来完成的。为了实现模块化以及数据的隐蔽,Java语言运用了功能代码封装的处理,Java语言对继承性的实现使得功能代码能够重复使用,用户可以通过将具体的功能代码封装成自定义的类,来实现对代码的再利用。
C++是一种经典的面向对象语言,Java语言延续了C++中面向对象的理论,但是在Java语言中去掉了部分复杂的技术,从而简化了面向对象的技术,例如运算符的重载等等之类的一些功能。在这样的处理之后,Java中的面向对象技术变得更为简便、易懂,同时保留了面向对象的核心技术,使用户能够方便的享受面向对象技术带来的方便快捷。
(4)异常处理
在Java程序开发中,提供异常处理的策略,能够对各种异常和错误进行处理。这些错误主要指程序在编译以及运行时出现的错误和异常,例如数组越界异常等等。Java中的这种非正常处理策略能够帮助使用者定位处理各种错误,从而极大提高了Java应用程序的开发周期。同时,这种异常策略能够高效捕捉到程序中的异常,针对不同的异常,用户可以采用不同的方法进行处理解决,从而保证了应用程序得以正常运转。
2.4 游戏图形界面的开发基础
(1)图形用户界面
图形用户界面(GUI)是如今非常流行的人机交互方式,它可以为用户显示图形界面,使用户能够通过看到的直接进行操作。Java本身拥有一系列的接口和类,使用户不需要直接调用操作系统API,为实现图形用户界面提供了便利。
(2)AWT介绍
AWT是一个不同于常规类型的组件,里面包括另外的一些组件。AWT是由java.awt包提供的,用户可以通过抽象窗口工具集,在容器中创建文本框等一些操作。AWT是Java语言GUI程序设计的核心,其库类非常丰富,包含构建Java图形界面程序的工具。AWT为用户提供了界面构件,给计算机与用户的交互提供了更好的便利。用来构建图形用户界面的独立平台主要由四部分组成。
一是组件类(Component),具体包括画布类、标签类、按钮类、文本框类、类表类、复选按钮类等。二是图形类(Graphics),是指与图形处理的相关一些类。三是容器类(Container),实际上也是一个组件,即扩展组件的抽象基本类。容器中可以有许多组件。由Container转化过来的类有很多,通过这些类创建的对象称为容器,用户可经过调用add()方法在容器中添加组件,实现与系统交互的目的。
(3)Swing介绍以及程序设计
Swing是于1996年末才开始被设计的,是一套由JFC(Java基础类库)提供的用于开发图形用户界面,作为Java基类的一部分,是Sun公司提出的图形用户接口工具包。Swing能够开发出功能完善、视感独特的应用程序。同时,Swing具有优良的扩展能力,提供许多功能齐全的组件。人们的开发工作由于Swing的存在而变得简化。Swing完全是利用Java语言来实现的,它的屏幕显示性要比AWT好。不过Swing是在模仿,不属于运用原生平台来提供设备,因此能够在不同平台上使用Swing图形用户界面组件。
Swing是在AWT的基础上扩充而来的,有多于AWT的丰富组件,这样的优势在于开发GUI应用程序时更为方便、灵活、效率高,这种方法设计的GUI感受更加良好。
Swing编写GUI程序主要使用到的是轻量组件,该组件不是设置在自己的窗口当中,而是被设置在包含它的容器中。为了能够供给用于绘制Swing轻量组件的窗口,Swing提供的窗体、窗口以及小应用程序等必须是重量组件。使用Swing编写GUI程序时,可以利用JFrame类创建窗体,在JFrame类中拥有多种设置窗体的方法,JFrame类构建的窗体在未设置时并不可见,因此在需要显示这样的窗体时,选择调用setVisable(Booleab b)方法设置可见,这样就可以显示在显示器上。在创建窗体时,需要设置窗体的大小、标题、关闭按钮的动作,设置关闭按钮的动作可通过setDefaultClose(int operation)方法。
Swing组件需要添加在与Swing顶层容器相关的一个控制面板上,并不能简单地添加到顶层容器当中去。从而可以避免使用Swing的重量级组件。向JFrame中添加组件包括两种方法:一种方法是创建中间容器,将组件添加到容器中,用setContentPane()方法将这个中间容器设置为JFrame的内容面板。 另一种方法是先通过getContentPane()获得内容面板,然后再将组件添加到内容面板中。常见的面板包括JSplitPane、JPanel、JScrollpane等。使用Jpanel面板的用途有:在不使用面板时,界面难以进行分区,此时的组件只能被迫采用一种布局方式,难以设计出画面美观的界面;某些布局方式只能够管理有限的组件,这会束缚设计思想。
组件是软件系统和用户进行交互的桥梁,也是图形用户界面的基本元素。一般的组件包括:标签组件,主要用来文本以及图像的显现,配合其它组件输出说明信息。标签组件提供了很多设置标签的方法,常见的有setText(String text)、setFont(Font font)等;按钮组件,包括按下和释放两种状态,需要通过捕捉按下、释放动作才能执行操作;密码框,用于需要进行密码设置的场合,接受单行文本信息,不显示输入的真实信息,会用星号或者其它图表表示输入的位数,常用的方法有getEcho()(获得回显示符,返回的类型为char型)、setEchoChar(char c)(指定回显示符,默认为“*”)、getPassword()(获取用户输入的信息,返回类型为char型数组);文本框,同样是用于接受用户输入的单行文本信息,可以在创建之后利用setText(String t)方法设置文本信息,也可以创建默认文本的文本框对象,常用的方法有setText(String t)()(设置文本框中的信息)、setFont(Font f)(设置文本框中文字的字体)、setColumns(int columns)(设置文本框中最多可显示内容的列数)等。
(4) 绘图技术
AWT的绘图技术主要包括update()、paint()、repaint()这3种方法,update()方法和paint()方法都包含有Graphics类参数。Graphics是画图的要素,它能够支持两种绘图:一种是画图象,主要运用于制作动画;另一种是画线、矩形等基本绘图。
java.awt.Graphics类是Java中最重要的处理图形的类,该类中有图形、图像的操作方法,用于绘制线、几何图形、文字等。在编写程序时,应该预先把java.awt.Graphics类导入到Java程序中。Graphics类的使用方法较比于其它有所区别,比如在屏幕上绘制图形时,需要一个画板,该画板必须是一个实体,这样Graphics类可以在画板上对各种画图进行处理,而不需要构建一个该类的实类对象。
Graphics中图形的绘制方法包括:
update( ):用途是改变图形,调用paint();
paint( ):肯定要经过变化,用于绘图的特定的操作;
(5)游戏过程当中的交互
游戏的开发过程是一个与用户玩家进行不断交互的过程,根据一批玩家在试玩结束后对游戏提出改进的意见或者建议。只有这样,才能够了解玩家真实的内心想法。在初级设计阶段,我问询了家人以及朋友的想法,体现到游戏当中,比如大招清空的设置,子弹的选择,大BOSS的子弹发射都进行了相应的调整与改进。
(6) 多线程技术的应用
在同一个进程中,多个线程有许多时候需要共享一个对象,但是若它们能够同时访问某对象,就会产生共享数据的冲突。为了避免出现这种多个线程共同访问一个对象所引起的访问冲突问题,Java语言包含了线程同步机制进行处理。线程同步能够有效解决非单一线程同一时间使用同一个对象的问题,避免某一个线程的数据被其它线程生成的数据覆盖的问题。Java语言运用到了监听器的技术,它为受保护的共享对象添加了一把“锁”,只有拥有“钥匙”的线程才能进行操作,而每次的“钥匙”必须进行申请,没拿到“钥匙”的线程必须进行等待,直到拿到“钥匙”。实现非单一线程同步有两种途径:一种是方法同步,这种方法是避免多个线程同一时间访问某个方法,解决的办法是在定义中加入synchronized,如果出现某一线程已经对方法进行了访问,那么其它线程只能通过等待,然后才能访问。另一种是对象同步,针对于某一数据对象,无论该对象有多少个线程要进行访问,在同一时间只能进行一个线程的访问。
在一些多线程的应用中,线程之间应相互交流、互相通信。在Java语言中,java.lang.Object类具体有3种方式来协调线程之间运行关系的功能,通过线程方法使得现场之间互相等待。
(8)Java网络技术的应用
Java语言与网络有着密不可分的联系,Java语言的发展与网络的发展相互联系。网络编程是指通过网络协议以及其它计算机完成直接或者间接的数据传递。网络编程一般通过两种方法实现,一种是借助Socket套接字实现基于TCP协议的网络编程;另一种是利用URL类以及URLConnection类对WWW网络资源进行访问。URL指统一资源定位符,是描述Internet中网页或者是其它资源的地址的标识方法,它是通过顺序排列的字母或者是数字确定地址。用URL类的方法可以从网上读取数据,若还想输出一些数据,则需要用到URLConnection类。
2.5 Java游戏程序的基本框架
(1)电子游戏的开发与设计是艺术和科学的完美结合,游戏动画的制作是电子游戏设计的根基,大部分的游戏都是在动画的基础之上添加玩家与电脑的交互功能。动画主要包括游戏动画和影视动画。其中游戏动画表示在显示屏上显现出一系列的不间隔动画,动画的出现首先需要显示第一帧图形,接着在下一个不长的时段内显现下一帧,按这样的顺序依次进行,使用户感觉画面上的物体在动。另外,动画的制作需要设置合理的帧频。尤其在一些需要大量动画的游戏中,就需要取舍屏幕上显示的图像大小和FPS(每秒针的帧数)。
(2)游戏动画的制作,要想达到将一连串的图像快速循环播放的目的,需要构造循环语句用于控制图像的连续播放。同时也要利用到线程中的暂停函数,这是因为动画都需要播放速度,暂停函数可以起到既能连续播放动画又可以控制动画的播放速度。游戏当中,动画在运行的时候,有可能会出现屏幕闪烁的现象,这时就需要用到双缓冲技术。所谓的双缓冲,其实就是在计算机内存中占据一块空间作为后端的图像,程序通过改动、绘制结束之后后再出现在显示屏上。双缓冲技术是Java游戏的关键技术。
虽然双缓冲技术会消耗额外的内存,但是如今的计算机内存都相对较大,在大多数情况下,程序员都不需要优先考虑节省内存,玩家在游戏中的画面感受等才是至关重要的。所以说,利用一些内存的消耗来换取游戏质量的提高还是很合理的。
(3)游戏中的碰撞检测。游戏开发与设计中,会涉及到许多物体之间的碰撞问题。矩形碰撞、像素碰撞和圆形碰撞等都是常见的碰撞。我们把游戏中的角色称为Actor,也就是游戏当中会出现的一些飞机等,将其中的每个Actor框成与角色面积相同的矩形框。那么,游戏中的检测就是观察矩形框之间是否存在交集。如果是测试对象之间边界是否出现重叠,则可以利用圆形碰撞。通过比较对象的路径长度和半径大小,假若对象之间的长度比它们半径总和小,表明游戏中过程之中出现了相撞的情况。
还有一种是像素碰撞,前面提过,游戏当中设定的角色往往用一个矩形区域来表示,由于角色并不都是规则图形,但用矩形区域包起来后,就会出现两个角色之间实际没有产生碰撞,但是矩形碰撞检测的结果却表明它们出现了碰撞。如果使用像素检查,则把对象的背景设定为相同的颜色,此时不会出现上述问题。像素碰撞的缺点是计算量较大,消耗过多的系统资源。因此,除非严格要求的情况,一般使用的是矩形检测碰撞。
3 雷电游戏模块设计
3.1 用户需求分析
大部分的射击类游戏都存在一定的相似性,雷电游戏也不存在特殊。其实就是一个周而复始的情形,一直到游戏结束才能够停止。游戏开始阶段接受玩家的输入并对这个输入办理,如果没有结束就会不断产生飞机,通过检查我方飞机的血条判断游戏是不是最终结束。
该雷电主要就是我方飞机与敌方飞机的射击比拼,首先需要有界面来装载整个项目,通过键盘的上、下、左、右键遥控自己的飞机,z、x键进行子弹发射的选择,然后是敌方飞机的出现方式,敌机子弹的生成,通过各个关卡,最后得出比赛的结果。
雷电游戏主要包括以下功能:
(1)雷电游戏状态调整功能 :在游戏启动时,游戏会自动进行初始化的验证,若初始化成功后,界面会自动进行跳转,跳转到游戏开始界面,有开始、暂停、恢复游戏等选项。
(2)雷电游戏难度的升级:当进入游戏后,随着时间越来越长,游戏难度会越来越大,界面中敌机增多,对飞机造成伤害的子弹增多,游戏难度增加,最后会遇到一个血条较长的怪兽,攻击其至血条为0时,自动过关跳转到下一关卡。
(3)玩家对飞机的控制功能:玩家可以对飞机进行操控,通过前后左右键来控制飞机的飞行路线。
(4)游戏界面绘画功能。
3.2 可行性研究
在进行任何一项工程项目时,先要做的是可行性研究和分析,对各种可能性方案进行研究比对,比较它们的优劣。可行性研究的主要目的就是在尽可能短的时间段内用相对较小的代价确定问题是否能够得到解决。先要进行概要的分析,大致明确项目目标并完成整体规划,从而判断原先系统的目标能不能正常实现以及是否有它设计、产生的价值。总体而言,可行性研究是通过抽象的方式进行分析和研究。
对于此基于Java的雷电游戏,下面将从技术、利益、社会的角度进行明确阐述。
1.技术可行性
谈及技术可行性,其实就是看所依靠的技术条件是否能够满足本次项目的开发工作。本次项目设计开发平台是Eclipse3.1,开发语言是Java,平台无关性是Java语言所拥有的最大优势,而且Java能对各种异常进行处理,能够满足雷电游戏的开发需求。在硬件方面,随着如今时代的快速发展,计算机的运行速度逐步加快,人们也能够负担得起,功能方面的可靠性也逐步提升。对于我的这个雷电游戏非常适合。
综上所述,本软件的开发在技术上是可行的。
2.经济可行性
该雷电游戏项目开发成本较低,没有经济方面的困难,并且该雷电游戏在工作效率方面有相当明显的优势。同时软件变更方便且实用性强,在项目运行成功之后以后的更改也很方便。用户只需要将软件安装到自己的电脑当中,当人们对雷电的某部分功能不太满意时,只需要对信息进行变更,将特定的功能模块进行调整升级。
综上所述,本软件在经济上具有可行性。
3.社会可行性
该雷电游戏的社会可行性将从法律因素、玩家使用可行性两方面综合阐述。
(1)法律因素
本次毕业设计是基于Java的雷电游戏,参考了市场上现有的雷电游戏,观察了它们所实现的功能以及不足之处,但软件的开发与论文的编写是独自完成的,没有抄袭过市场上或网上的同类产品。
(2)玩家使用可行性
这样既减少投入成本又简化了操作环节。该雷电游戏适用于群体大众,操作简单、易上手,不需要提前进行练习培训,可行性较高。
综上所述,本软件具有社会可行性。
3.3 总体设计原则
软件总体设计的任务是软件模块设计以及软件体系结构设计。软件体系结构是软件系统中最本质的要素。因为体系结构就是对复杂对象进行抽象,能够描述各类风格的软件系统结构,高效的处理各种各样的需求。良好的软件体系结构代表着高效与稳定。
该雷电游戏项目的主要设计原则有:
简单性:该软件项目实现了雷电游戏的所有功能,并且在操上作简单易懂、容易上手,适用于大部分人群。
针对性:该雷电游戏是基于Java的程序设计项目,具备较强的针对性。
实用性:该程序设计项目能够实现雷电游戏的全部功能,其中关卡和终极大BOSS的设计更加体现了良好的实用性。
3.4 功能模块设计
3.4.1 游戏状态控制功能
雷电的阶段包括开始、暂停、恢复和结束,最先需要等待游戏的加载启动,假若游戏过程中,玩家如果因为特殊事情需要离开可以选择暂停比赛,等到再次回来可以进行比赛的恢复。
3.4.2 游戏难度的调整
随着游戏的进行,游戏的难度会相应的增加,比如敌机的数量会越来越多、敌机子弹的数量也会有所增加,这些都是对玩家造成伤害的因素,这些伤害因素越多,游戏的难度相应就越大,最终每一关卡都有一个怪兽守关,它的血条、子弹都造成了游戏难度的增加。
3.4.3 游戏界面绘画功能
游戏主屏用来输出用户对己方的控制与敌方的动作显示。在屏幕的右下角会有己方飞机的生命值的显示,在游戏的左下角会有全屏爆破的剩余次数显示,通过这些显示,可以增加玩家的游戏体验性,达到一个更加人性化的界面,为用户提供更好的界面舒适度。
3.4.4 玩家游戏控制功能
用户玩家可以通过键盘的上、下、左、右键控制飞机的移动,通过移动来躲避敌方飞机带来的伤害,通过z、x键控制子弹的发射,通过发射子弹来对敌机造成伤害。
3.5 关键技术
(1)游戏美工。游戏中需要使用的游戏素材有自己控制的飞机、敌方飞机、游戏过程当中飞机所产生的子弹、飞机被命中的爆炸图片等。这些素材的选择尤为重要,游戏中清新亮丽的画面可以给玩家带来充足的美感和游戏体验。所以,在这个“雷电”游戏的素材选择中,应挑选一些立体感强的图片,给玩家更大的视觉冲击。
(2)多线程技术的实现。多线程编程能够提供程序两个或两个以上并发执行任务的能力,极大改善程序的响应性能,有效提高资源的利用效率。采取Runnable接口的方法达到定义用户线程的功能,这样既不会对继承其他类有所变化,也不会改变实现其它接口。
(3)用户飞机子弹与敌方飞机的相撞测试。包括自己控制的飞机与敌方飞机或子弹的相撞等。在这一过程中,将所有子弹对象的矩形区域与敌机对象的矩形区域逐个以此进行检测,如果出现重叠则说明子弹与敌机发生了碰撞。
(4)游戏地图滚动原理的实现。我们在坐火车时都产生过一种错觉:自己乘坐的火车没有发生移动,但如果旁边有其他火车发生移动,我们就会感到是自己的火车在移动。这种现象与飞机射击类游戏的地图原理类似,即通过背景图片的来回滚动,给游戏玩家一种是自己操纵的飞机向前飞行的感觉。
4 雷电功能实现
4.1 游戏首页的实现
4.1.1 游戏的素材选择
随着时代的发展,人们的思想也越来越进步,玩家对于精神领域的需求也越发显著,所以在游戏类型项目的设计过程中,游戏中的物体形式、动画设计等显得格外重要。在准备阶段,我通过咨询身边的同学及朋友,选择了充足的游戏素材,如玩家的飞机类型、飞机所能发射子弹的样式、飞机被击毁的爆炸图片及背景等。
4.1.2 游戏中飞机、子弹的实现
在此雷电游戏中所使用的飞机和子弹均采用对应的类来实现。整个游戏当中涉及最多的就是飞机和子弹,为了检测飞机与子弹、飞机与飞机之间的碰撞,每一架飞机与每一颗发射出来的子弹都需要对其相应的飞机和子弹在屏幕中的坐标地点进行跟踪。这样屏幕中飞机与子弹的碰撞就可通过子弹和飞机所构成的矩形区域的交集来进行判断。计算此时屏幕当中的每一架飞机和每一颗子弹就可得出碰撞结果,得到碰撞的飞机对象,然后显示爆炸图片。
4.1.3多线程
如同日常工作安排中由多人共同完成一项工作一样,多线程能够使程序多个并发执行任务。在多核心的时代中,多线程能够使程序的性能有所增大以及使资源能够得到更合理的利用,用处极为广泛。在Java语言当中,多线程功能可以满足在一个程序当中同一时刻执行好几个任务,但人们并没有察觉到线程的交替进行,而觉得所有线程同一时刻一起运行,这源于CPU在线程间的迅速切换。多线程还能提供更好的交互性以及实时控制性能。新构建的线程包含5种状态。
一是新建,即一个Thread、Thread子类的对象声明、构建时,新生成的对象就会是一种新建状态,此时,线程已经被初始化,并且拥有相应的资源。
二是就绪,当新建的线程开启之后,会进入线程队列进行排队,此时线程已达到了运行的资格,需要准备CPU时间片,如果轮到它享有CPU资源时,就具有构建自己生命周期的机会,可以离开它的主线程。此外,处于阻塞状态的线程也会进入就绪的状态。
三是运行,在第二步骤下的线程通过排队获取到资源以后,紧接着将会步入运行的状态。run()方法存在于每一个Thread类及其子类中。在线程对象处于执行态时,会调用线程对象的run(),run()方法当中有该类线程的功能以及操作。
四是阻塞,存在一种正在正常执行的线程被人为挂起的非正常情况下,此时,将迫不得已的让出CPU而且终止本身的执行态,转入到了阻塞状态。该状态下不能参与队列排队,只有当这种迫不得已的非正常情况消失之后,线程才能再一次转入第二步骤,然后再一次去线程队列中排队获得CPU资源以进行未完成的过程。
五是死亡,线程死亡的一种情况是该线程被强迫性结束,比如用destroy()来停止线程。另外一种情况是一个线程按照常规运行完所有的安排,结束了run()的所有语句,最后退出。处于死亡状态下的进程不再具有运行的能力。
Java实现多线程包括两种方法,一种是在用户自己的类完成Runnable接口,这个特殊的接口有且只有一个run(),在此方法中需要规定方法体并且明确具体的操作。在线程处于运行状态时,将会执行run()方法中的操作。二是创建用户本身的Thread线程子类。该类封装了线程的属性及行为。Thread类的主要方法包括:开始线程的方法、定义线程步骤的方法、暂停线程的方法、结束线程的方法及判断是否消亡的方法。
上述实现线程的两种方式并不是完全相同的,即使它们均可以通过一定的操作得到独立的执行任务。继承Thread类的方式特点是操作简单,但它的特点也比较突出,因为Java语言并不支持多重继承(多重继承虽然普遍存在,但是使用复杂,编译程序也不易实现),所以继承了该类就不能够继承其它的类,这会影响项目开发。对于实现Runnable接口的方法则既不影响实现其它的接口又不影响继承其他类,这种方法灵活性更加突出。所以此次雷电游戏项目采用Runnable接口实现多线程。
4.2 游戏首页的实现
4.2.1 界面实现
游戏在初始进入时,会跳转出游戏启动界面,点击任意键会自动加载进入游戏中。界面模式是下图4-1。