基于java的飞机大战游戏系统设计与实现(项目报告+源代码+部署视频)

您所在的位置:网站首页 java分布式项目案例报告 基于java的飞机大战游戏系统设计与实现(项目报告+源代码+部署视频)

基于java的飞机大战游戏系统设计与实现(项目报告+源代码+部署视频)

2024-07-03 12:30| 来源: 网络整理| 查看: 265

项目报告 基于Java的飞机大战游戏的设计与实现

现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communication ,第四代移动通信技术)网络的深入,越来越多的IT行业开始向手机行业转移重心。而手机行业中游戏方面的利润所占比重较大,并且手机游戏大多数则是由Java语言开发研制的。所以我想顺应时代发展,用学到的Java知识对游戏进行一次深入的了解与创作。

Java语言在我们大学学习中占了很大的比重,其优点甚多:面向对象,可靠,安全,多平台可移植,高性能,多线程等。面向对象是相对于c语言的面向过程来说的,在面向对象编程中,我们用Java去新建一个对象,调用其方法就能实现我们的目标,并不需要了解这个对象的方法的具体实现过程;Java的可靠安全特点体现Java不支持指针,禁止第三方访问,杜绝了外部风险。所以使用Java开发游戏,是一个正确的选择。

大学学习即将结束,在毕业之际,我想用我4年里学习的知识为自己编写一个属于自己的游戏——飞机大战游戏,为我的大学生活画上圆满的句号。

关键词:Java游戏;面向对象;可靠安全;多线程

目 录

1  引言.................................................................................................................. 1

1.1  项目背景.............................................................................................. 1

1. 2  国内外研究现状.................................................................................. 3

1.3  项目主要工作...................................................................................... 4

1.4  本文组织结构...................................................................................... 6

2  开发平台与开发技术...................................................................................... 7

2. 1  IntelliJ IDEA简介............................................................................... 7

    2. 2  IntelliJ IDEA与Eclipse 、MyEclipse的比较.................................. 8

2. 3  Java.................................................................................................... 10

3  可行性研究.................................................................................................... 13

3. 1  技术可行性........................................................................................ 13

3. 2  经济可行性........................................................................................ 13

3. 3  操作可行性........................................................................................ 14

3. 4  用户使用可行性................................................................................ 14

3. 5  法律可行性........................................................................................ 14

4  需求分析........................................................................................................ 15

4. 1  系统需求概述.................................................................................... 16

4. 2  功能模块设计.................................................................................... 17

4.2.1  游戏状态控制功能模块.......................................................... 17

4.2.2  游戏难度的调整模块.............................................................. 17

4.2.3  游戏界面绘画功能模块.......................................................... 17

4.2.4  玩家游戏控制功能模块.......................................................... 17

4. 3  游戏难点分析.................................................................................... 18

4.3.1  绘图美化.................................................................................. 18

4.3.2  多线程技术的实现.................................................................. 18

4.3.3  防碰撞问题的解决.................................................................. 18

4.3.4  动画的实现.............................................................................. 18

5  飞机大战功能实现........................................................................................ 19

5.1  模型图................................................................................................. 19

5.2  软件功能模块..................................................................................... 19

5.3  游戏首页的实现................................................................................. 20

5.3.1  界面实现.................................................................................. 20

5.3.2  流程图...................................................................................... 21

5.3.3  核心代码.................................................................................. 22

5.4  游戏开始模块的实现......................................................................... 24

5.4.1  界面实现.................................................................................. 24

5.4.2  流程图...................................................................................... 25

5.4.3  核心代码.................................................................................. 25

5.5  发射子弹模块的实现......................................................................... 27

5.5.1  界面实现.................................................................................. 27

5.5.2  流程图...................................................................................... 28

5.5.3  核心代码.................................................................................. 29

5.6  积分模块的实现................................................................................. 33

5.6.1  界面的实现.............................................................................. 33

5.6.2  核心代码.................................................................................. 34

5.7  防碰撞逻辑 ........................................................................................ 37

5.7.1  核心代码.................................................................................. 37

5.8  游戏操作的实现................................................................................. 39

5.8.1  核心代码.................................................................................. 39

5.9  特殊NPC蜜蜂................................................................................... 41

6  系统测试........................................................................................................ 42

6.1  测试的定义及其重要性..................................................................... 43

6.1.1  测试的定义.............................................................................. 43

6.1.2  测试的重要性.......................................................................... 44

6.2  测试方法............................................................................................. 46

6.3  测试结果............................................................................................. 50

7  结论................................................................................................................ 51

参考文献.............................................................................................................. 52

致谢...................................................................................................................... 54

外文文献.............................................................................................................. 55

中文翻译.............................................................................................................. 63

1  引言 1.1  项目背景

90后的我们,童年最开始接触电子游戏是在游戏厅,那时候的飞机大战游戏机前,往往人山人海,绚丽多彩的画面,带感操作让人沉醉不能自拔。再后来,珍珠港(Pearl Harbor),虎虎虎(Tora! Tora! Tora!)等空战电影中激烈的空战和飞机在天空中的英姿让我彻底爱上了空战,所以毕业设计我选择了与飞机战斗有关——基于Java的飞机大战游戏的设计与实现的毕业设计。

而选基于Java的飞机大战游戏的设计与实现为题,是对大学期间学到知识的一次实践运用,也是对自己大学四年学习成果的一次检验。

柏拉图:“游戏是一切幼子生活和能力跳跃需要而产生的有意识的模拟活动。”亚里士多德给游戏的定义是:“游戏是劳作后的休息和消遣,本身并带有任何目的性的一种行为活动。”可以说,游戏是一种一直存在的社会现象,有了人类就有了游戏,人类与游戏息息相关。游戏也随着人类的进步有了新的发展。

PC机刚开始普及的时候,游戏并不能被广泛接受。最主要的原因就是不能充分发挥PC机的性能,即游戏程序不能最大化使用PC机的硬件资源,导致PC机的早起游戏画面差,操作感僵硬,可玩度不高,所以不被人们所接受。但是随着切硅的技术的提升导致CPU性能的飞跃及Java语言的开发,游戏程序对硬件资源的利用率的提高,现在游戏的各个方面都有了质的飞跃。比如20世纪末,暴雪公司下的《星际争霸1》掀起全球星际流,其操作感和画面打击感及游戏可玩性都有很大的提升。当然,除了游戏本身的优秀质量以外,可以较广的支持不同的硬件设备的功能也不容忽视,高中低端PC机都有不错的流畅度。

而飞机大战类游戏中起步较早的还要数由日本公司Cyber Front研制并发行的雷电系列,该系列操作简单,节奏明快,因此,可以说成是飞机大战游戏类的经典之作。该系列下的《雷电3》在2016年中旬从PS2平台移植到PC机平台上后,更成为当时风靡一时的游戏。

《雷电3》一共有8个关卡,分别是病变的森林,玄武岩城市。岩石港湾,金色的沙漠,原子核工厂,小行星带,大型宇宙舰和地方总部。雷电3的关卡不多,而且流程比较短,所以主要还是以刷新分数上限,挑战操作极限的目的为主,考验玩家的手速和反应能力,是一款极为经典的游戏,即使过去了十几年,《雷电3》仍然广受欢迎,各大应用商店的点击下载量还是很高,衍生出来的游戏更是数不胜数。

1.2  国内外研究现状

Java语言经过多年的发展,已经十分成熟。Java语言称霸企业级应用这门多年的事实证明了这门语言适合开发各种项目。当Java语言的运行效率随着发展再次提升了一大截后,Java语言的一系列优势就更加明显的体现出来了,比如:语言严谨,高抽象,可读性强等。

对于游戏开发,由于涉及到各种复杂的问题情况,经常遇到新的问题,所以在开发过程中,需要进行对代码进行不断的修改添加,这就需要可以随时随地的修改代码。而Java具有虚拟机特性,Java游戏本身也可以用Java来写,例如,目前的BeanShell,Groovy和其他脚本语言可以很容易地,无缝地与Java语言的互动,我们可以通过脚本随时对游戏进行添加与删除,不必要重新开发某个模块。这是大大方便了Java游戏编程。

在游戏的发展中涉及到了大量的Java技术,某些技术现在已经淘汰,但是也有些技术一直在使用。如Sun公司较早推出了3D技术-- Java3D,是一个高度封装的API,OpenGL和Direct 3D都是基于Java3D的,可以说是最有名的3D Java技术;Jogl函数则是opengl接口对Java的实现;lwjgl函数(light weight Java game library)是将游戏图形(opengl)、音效(openal)、控制输入集合为一,以成为Java界的directx(不是direct3d)而努力;joal函数则是Java对openal的一个绑定,是Java音效的一个解决方案;jinput函数是Java对非标准输入设备(游戏手柄,操纵杆)的解决方案; Project Wonderland是Sun开发的一个3d虚拟世界构建工具等。

由于VR(Virtual Reality)虚拟现实的发展,对游戏的发展影响巨大。科幻电影小说中的科幻游戏玩法有可能成为现实,未来游戏也许不需要鼠标键盘,只需要一个类似VRBox的头盔设备即可完成指令的输入与输出。

1.3  项目主要工作

本次项目的题目——基于Java的飞机大战游戏的设计与实现,主要目的是实现飞机大战这个游戏。期望结果:游戏无BUG(现在人们将在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题统称为BUG——漏洞),简单易上手,老少皆宜,让玩家“玩不释手”。

从游戏的玩法来说,主要就是我方飞机(Hero airplane)和敌方飞机(Enemy airplane)的对决,首先是游戏的开始界面与结束界面,然后就是我方飞机(Hero airplane)的移动方式(鼠标移动或者键盘移动,我打算选择鼠标移动,因为鼠标移动可以转移到手机上,现在大多数手机都没有键盘,基本靠手指滑动操作),接下来就是我方飞机(Hero airplane)子弹的生成,然后是敌方飞机(Enemy airplane)的出现坐标的选择,然后飞机与子弹防碰撞,飞机与飞机的防碰撞,最后是我方飞机(Hero airplane)与敌方飞机(Enemy airplane)的对战结果。

该游戏要满足以下功能性需求:

(1)游戏状态控制功能

    游戏的状态控制包括运行、暂停、恢复及结束游戏,首先是游戏的开始页面,在游戏正在进行时,如果你有其他的事情又不想结束游戏你可以将鼠标移出游戏界面或者鼠标在游戏界面单击即可暂停游戏,当你的其他事情解决后你还可以选择恢复游戏,继续玩下去,当游戏结束时会显示游戏结束界面。

(2)游戏难度的调整

     玩家随着玩游戏的时间的增加,敌方飞机的数量会增加,出现的频率会有所提高,移动速度也会提高。

(3)游戏界面绘画功能

     在右上角显示游戏时间(游戏难度于时间成正比,即游戏时间越长难度越高),玩家游戏得分,与我方飞机生命值,游戏主屏用来显示玩家对我方飞机(Hero airplane)的控制与敌方飞机(Enemy airplane)的出现及移动的显示。

(4)玩家游戏控制功能

     玩家可以通过控制移动鼠标或者键盘来控制友机的移动。

1.4  本文组织结构

  本文的组织结构如下:

  第一部分介绍了本文的国内外背景。

  第二部分介绍了开发游戏项目涉及到的软件平台与开发语言。

  第三部分介绍了项目的需求分析。

  第四部分介绍了项目各个模块的实现。

  第五部分介绍了对软件测试的过程及结果,找到项目的优缺点。

  2  开发平台与开发技术

本章主要介绍软件开发平台如何选择。本软件涉及到的开发平台是IntelliJ IDEA,开发技术是Java技术。下面将会介绍一下选择IntelliJ IDEA的理由。

2.1  IntelliJ IDEA简介

IntelliJ IDEA是一个Java的 集成开发环境(IDE),用于开发各种项目的计算机软件。它是由JetBrains公司(原名的IntelliJ)开发的,个人版被Apache 2授权许可,商业版则是作为专业版,可以用来进行大型的商业开发。

IntelliJ IDEA的第一个版本发布于2001年1月,并且是第一个具有先进的代码导航和一个代码重构的综合能力的Java IDE。

IntelliJ IDEA对于系统的要求:微软的Windows 10/8/7 / Vista/ 2003 / XP(incl.64位),最少1 GB内存,2 GB RAM(推荐),300 MB硬盘空间+至少1 GB的高速缓存,1024×768的最小屏幕分辨率。

IntelliJ IDEA特点:   1.编码提示  IDE可以进行代码提示,比如:结合上下文对当前代码进行补充;代码导航,可以快速定义到某个声明过的类;代码错误提示,对于代码错误的地方进行提示并且提供有效的解决方案。   2.内置工具和整合   IDE提供了构建与打包工具,如grunt , bower , gradle , 和 SBT 。它支持各个版本的控制系统,如 GIT , Mercurial , Perforce , and SVN 。可以直接从IDE对SQL Server,ORACLE,PostgreSQL和MySQL数据库进行访问。   3.各种各样的插件系统  IntelliJ IDEA支持插件,通过插件可以对IDE添加额外的功能。无论是从IntelliJ IDEA的插件库网站或通过IDE的内置插件,都可以进行搜索插件和插件的安装。目前的IntelliJ IDEA个人版则拥有1495个可用的插件,其中IDE的旗舰版则拥有1626个可用的内置插件。 2.2  IntelliJ IDEA与Eclipse 的比较

我们大学学习中,对于Java的开发工具一般都是选择 Eclipse,MyEclipse开发工具。Eclipse是Sun公司自己开发的Java开发工具,优点在于简洁没有插件,用户可以根据自己的需求自己寻找安装合适的插件,同时这也是它的缺点,没有提供插件,某些开发就会让人感觉不方便,并且插件都是个人开发,并不是适合所有人。MyEclipse则需要收费(虽然网上有破解版,但是并不提倡,支持正版从你我做起),它实际上是将eclipse和其他常用插件集成在一起的一个庞大开发工具,优势就是常用插件齐全,不用自行下载安装,当然支持自己扩展,劣势就是插件太多导致软件繁重,运行时占用系统太多资源,当然他是收费的(对于学生来说这个是致命的)。

IntelliJ IDEA更为优秀的原因是:IntelliJ IDEA更为智能,更贴合用户。以下进行详细说明。

调试  作为调试过程的一部分,我们通常希望选中一些表达式来查看它的值。在Eclipse中,你需要选择这种表达,并且准确选择整个表达式是很重要的,否则在Eclipse中无法评估它。在IntelliJ IDEA中,你只需按下有关快捷键,即可看到表达式的值。自动完成  自动完成功能的好坏是区分任何IDE的标杆。在这方面的感觉的背景下,IntelliJ IDEA则有一个定性的优势。IntelliJ IDEA不等待任何按键,比如,当你输入一个方法函数是,它立刻会明白方法函数希望将某个定义过的类作为第二个参数,这时会有一个静态变量在类名处呈现可见状态。对于用户来说,提供建议和想法是一个的确不错的做法。但是Eclipse做不到,Eclipse只能理解你当前输入的字符,并不能与前边的联系起来。重构  专业编程人员如果利用IntelliJ IDEA的IDE提供的重构将会事半功倍。所有IDE提供了一个用处非常大的重构。但话又说回来,IDEA的重构是非常智能的。它知道你想要什么,并提供了大多数情况下适用的不同的建议选项。

如果我们选择一个Java IDE作为开发工具,那么IntelliJ IDEA肯定比Eclipse的更好。这不只是一个个人品味的问题。客观来说IDEA的确是第一选择,它可以让你快速,方便地编写和修改代码,建议适当的函数,提供适当的方法。它不要求你准确选择表达式,但会猜测你想要做什么,。

2.3  Java

Java是一个通用计算机编程语言,是并发的,类型,面向对象的。它的目的是让应用程序开发者“一次编写,到处运行”,也就是说Java可以在任何设备上开发,也可以在任何装有Java虚拟机(JVM)设备上运行,而无需再次编译。

Java应用程序通常被编译成字节码可以在任何装有Java虚拟机上(JVM)的计算机体系结构上运行。

截至2016年,Java是最流行的编程语言之一,特别是对于客户端,服务器的Web应用程序,有报道称有900万开发者在使用Java语言进行开发。Java是由詹姆斯·高斯林在Sun Microsystems(这已经被甲骨文公司收购)创造的,并于1995年发布,作为Sun Microsystems的Java平台的核心组件开发,Java语言多从C和C ++中语法派生出来的。

最初有Sun公司对参考实现Java的编译器,虚拟机和类库下发专用许可证。截至2007年5月,按照Java社区进程的规章制度,SunRelicensed GNU下大部分的Java技术都在通用公共许可证下。其他人也开发了Java软件替代和实现了Sun公司下的一些技术,如GNU Java编译器(字节码编译),GNU Classpath(标准库)和IcedTea项目的Web(浏览器插件小程序)。 

目前(2016年6月)Java的最新版本是第8个版本,这是目前Oracle支持免费的唯一版本,单早期版本都是由甲骨文等公司在商业基础上的支持的。

詹姆斯·高斯林,迈克·谢里登和帕特里克·诺顿启动Java语言项目是在在1991年6月,Java最初设计则是用于交互式电视,但它相对于在当时的有线数字电视产业过于超前。后来该项目又由名称Green并最终改名的Java,从Java咖啡(来自爪哇的一种咖啡)得名。高斯林设计的Java与C / C ++ 语法风格相似,系统和应用程序的程序员会发现二者有很大程度的相似点。

Sun Microsystems公司在1995年发布了第一个公开的实行版本Java 1.0,它承诺“一次编写,到处运行”(WORA)。其相当安全,并设有配置的安全标准,它对网络和文件实行访问限制。主流浏览器很快将Java程序的能力纳入到网页中运行,导致Java迅速走红,然而大多数是外面的浏览器,但是这并不是原来的计划,所以在2016年1月,甲骨文宣布,基于JDK 9 Java运行时环境将不再支持浏览器插件。Java 1.0编译器由亚瑟·范·霍夫重新用Java编写,严格遵守Java 1.0语言的规范。Java 2,新的版本可以在不同类型的平台搭建不同的配置。 J2EE包括面向企业级应用的技术和通常在服务器环境中运行的API,而J2ME对API功能的移动应用进行了优化,桌面版改名为J2SE。在2006年,出于营销目的,将新版本J2分别命名为Java EE,Java ME,和Java SE。

1997年,Sun Microsystems加入ISO/ IEC JTC 1标准组织,后来的ECMA国际组织要求Java正式化,但它很快就从组织中退出了。但Java仍然是一个事实上的标准,控制Java社区的标准。

2006年11月13日,Sun在GNU通用公共许可证(GPL)条款支持下将其Java虚拟机(JVM)公布于众。

2007年5月8日,Sun完成了开源的所有过程,在自由软件/开源分发条款下放出了它所有的JVM的核心代码,除了从Sun未持有版权的小部分代码。

2010年4月2日,詹姆斯·高斯林(Java的主要创始人)从甲骨文公司辞职。

  3  可行性研究

可行性研究顾名思义,研究其的可行性。可行性研究是项目开发之前的重要阶段。在软件开发实践中,软件开发人员或者用户对市场的了解不充分,对技术的掌握不好,对进行开发的各项风险评估不足等因素,有些问题不能再预期下得到解决,造成不可预估的损失,为了避免盲目的软件开发和不必要的损失,相关人员需要对开发特定软件项目的可行性进行研究,结合资金、时间和环境等各方面的制约条件,对该软件产品是否能够解决存在的问题,是否能够带来预期的效果和价值做出评估。

3.1  技术可行性 

现在开发游戏的语言一般都是Java语言,为了保证开发出来的游戏可以在手机、Web浏览器、PC客户端等平台使用,所以就要求开发语言可以在多平台移植,而Java语言刚好符合这个特性。开发工具IntelliJ IDEA可以下载并且可以免费使用,Java的编译工具JDK也可以在Sun官网上直接下载安装,其过程十分简单。

3.2  经济可行性

配置较低的电脑也能进行Java游戏的开发,一台电脑就行,开发成本低。由于Java具有跨平台以及一次编译,到处运行的特点,开发出来的游戏可以放到各大游戏平台上发售,玩家可以在电脑,浏览器,手机等各种平台运行。而且软件维护简单,实用性强,一次开发使用,即可长久使用,当软件满足不了用户需求时,只需对用户的需求进行添加即可。 

3.3  操作可行性

本游戏操作简单,在电脑和浏览器上可以用鼠标键盘操作,在手机上可以用手触摸屏幕运行。

3.4  用户使用可行性

    本软件操作简单,对用户的要求,不需要多强技术能力。

3.5  法律可行性

信息产业部已将游戏通用引擎研究及示范产品纳入国家“863计划”,这是中国首次将游戏技术纳入国家科技计划当中。

4  需求分析

需求分析是对即将开发的系统确定一个完整的,准确的要求。需求分析的结果是否完美解决了用户的问题,将直接影响到后面的进程,并影响到设计结果是否能让用户接受。软件需求分析对软件系统提出了清楚、准确、全面而具体的要求,是对软件使用者意图不断进行揭示与准确判断的过程,它并不考虑系统的具体实现,而是严密地、完整地描述了软件系统应该做些什么的一种过程。

4.1  系统需求概述

飞机大战主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐。我方飞机可以随意移动,敌方飞机无规律出现。游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就一直能发射子弹,当我方子弹碰到敌方飞机时,敌方飞机消失。当玩家飞机碰到敌方子弹时,生命值减一,直到玩家飞机生命值为一时,游戏结束。

基于Java的飞机大战游戏的设计与实现有以下几个模块:

    (1)游戏状态控制功能模块

    (2)游戏难度的调整模块

    (3)游戏界面绘画功能模块

    (4)玩家游戏控制功能模块

4.2  功能模块设计 4.2.1  游戏状态控制功能模块

游戏的状态控制包括运行及结束游戏,首先进入游戏的开始页面,在游戏进行时,玩家必须躲避或者击落敌方飞机,玩家飞机的生命值降低为0的时候游戏就会结束,弹出游戏结束界面。

4.2.2  游戏难度的调整模块

玩家玩的时间越长游戏的难度越高,敌方飞机的数量越多、敌方飞机出现的频率越高,玩家保证飞机的存活的难度越高,操作难度相应也高。

4.2.3  游戏界面绘画功能模块

左上角会显示玩家飞机当前生命值,游戏时间,当前分数,其他地方用来输出玩家对我方飞机的控制与敌方飞机的动作显示

4.2.4  玩家游戏控制功能模块

 玩家可以通过控制鼠标或者键盘来控制方飞机(Hero airplane)的移动。

4.3  游戏难点分析 4.3.1  绘图美化

清新靓丽的游戏界面将给用户带来愉悦的美感。因此,在这个游戏中,主要参考原始的游戏画面,敌我飞机的形象也应该是美丽的。

4.3.2  多线程技术的实现

应用程序线程机制的基石,实现了游戏,游戏的刷架的控制,装上各种角色的资源和背景(如飞机,机友)的要求,以实现整个游戏实现自动控制线程 控制。

4.3.3  防碰撞问题的解决

例如,敌方飞机与玩家飞机防碰撞,敌方飞机与玩家飞机防碰撞,等等。防碰撞检测技术实现在不同情况下,有不同的防碰撞检测方法。

4.3.4  动画的实现

用图片的阵列,动画切片变换形成。图像阵列,千变万化的图像画在画布标,使动画,这是一个图像的形成阵列。使用切片来实现动画,所有的帧都放置在相同的图像中,以达到爆炸的效果。

5  飞机大战功能实现 5.1  模型图

 

音效资源文件

                                     surfaceCreated

                R.java                         回调方法

子弹,敌机

类文件

SurfaceVIew

界面

SurfaceHolder

Callback接口

图片资源文件

图1-1  飞机大战游戏的模型图

5. 2  软件功能模块

图1-2  飞机大战游戏的软件功能模块图

5.3 游戏首页的实现 5.3.1 界面实现

    飞机大战的界面如图1-3所示。

图1-3 飞机大战游戏开始界面

5.3.2  流程图

    游戏开始的流程图如图1-4所示。

图1-4  游戏初始化流程图

5.3.3 核心代码

游戏初始化代码如下:

\*

*   写于3月20日,主要目的:完成游戏的初始化过程

*\

public final void paint(Graphics g) {

      g.setColor(this.bgColor);

      g.fillRect(x, y, width, height);

      g.setColor(this.fgColor);

      g.drawRect(x, y, width, height);

      this.paintBoxContents(g);

}

private void paintBlock(int x, int y, int blockType, Graphics g) {

      int blockX = this.boardX + (this.blockSize * x);

      IntblockY=this.boardY+(this.blockSize*(y-TetrisConstants.TOP_

      VISIBLE_ROW));

      if(TetrisConstants.BLOCK_EMPTY != blockType) {

            g.setColor(TetrisConstants.COLOR_BLACK);

            g.fillRect(blockX + 1, blockY + 1, this.blockSize - 1, this.

            blockSize - 1);

            this.setColor(blockType, g);

            g.fillRect(blockX, blockY, this.blockSize - 1, this.blockSize - 1);

            }

else {

            g.setColor(TetrisConstants.COLOR_WHITE);

            g.fillRect(blockX, blockY, this.blockSize, this.blockSize);

            }

      }

5.4 游戏开始模块的实现 5.4.1 界面实现

飞机大战的开始界面如图1-5所示。

图1-5  飞机大战开始界面

5.4.2 流程图

流程图如图1-6所示。

图1-6  游戏开始模块程序流程图

5.4.3 核心代码

下面是游戏开始模块的功能代码,如下:

\*

*   写于3月27日,主要目的:完成游戏的开始界面

*\

private int clearCompletedRows(TetrisPiece piece) {

       TetrisBoard board = this.getBoard();

       for(int i = 0; i < TetrisConstants.FOUR_BLOCKS; i++) {

            int rowY = piece.getBlockY(i);

            if(board.checkRowCompleted(rowY)) {

                 this.markRowCompleted(rowY, true);

            }

       }

       int numClearedRows = 0;

       for(int y = TetrisConstants.HEIGHT - 1; y >= 0; y--) {

            if(numClearedRows > 0) {

                 board.dropRow(y, numClearedRows);

            }

            if(this.isRowCompleted(y)) {

                 numClearedRows++;

                 this.markRowCompleted(y, false); 

            }

       }

       for(int i = 0; i < numClearedRows; i++) {

            board.clearRow(i);

       }

       return numClearedRows;

}

5.5 发射子弹模块的实现 5.5.1 界面实现

    发射子弹界面实现如图1-7所示。

图1-7  发射子弹界面

5.5.2 流程图

    流程图如图1-8所示。

图1-8  发射子弹模块程序流程图

5.5.3 核心代码

    发射子弹实现代码如下:

\*

*   写于4月5日,主要目的:完成游戏的子弹的自动发射

*\

    public void rotate(int pivotX, int pivotY, boolean rotateDirection) {

       if(TetrisConstants.ROTATION_TYPE_TOGGLE == this.rotationType) {

            // 如果翻转类型为TOGGLE

            rotateDirection = this.rotationToggle; //判断翻转方向

            this.rotationToggle = !this.rotationToggle; // 如果与canRotate匹配,

               中心点方块将被使用

       }

       // 重构四个小块,每个都转动

       for(int i = 0; i < TetrisConstants.FOUR_BLOCKS; i++) {

            int blockX = this.getBlockX(i);

            int blockY = this.getBlockY(i);

            //  左旋转:交换x和y坐标,x坐标取反

            //  右旋转:交换x和以坐标,y坐标取反

            int dx = blockY - pivotY;

            int dy = blockX - pivotX;

            if(rotateDirection) {

                 // 如向左旋转

                 dx *= -1;

            } else {

                 // 如向右旋转

                 dy *= -1;

            }

            int rotateX = pivotX + dx;

            int rotateY = pivotY + dy;

            this.setBlockCoords(i, rotateX, rotateY);//得到翻转后的新坐标

       }

}

    选中敌机目标后,开始发射子弹。在TetrisBoard.Java中的checkRowCompleted()方法实现了此功能,其代码如下:

    public boolean checkRowCompleted(int rowY) {

       for(int x = 0; x < TetrisConstants.WIDTH; x++) {

            if(TetrisConstants.BLOCK_EMPTY == this.getBlockType(x, rowY)) {

                 // 选中目标,发射子弹

                 return false;

            }

       }

       return true;

}

    当击中敌机后,积分就会有所变化,计算并显示出用户当前的分数。同时等待玩家键入数字,选择游戏难度开始新的游戏。其实现由init()方法控制,其代码如下:

\*

*   写于4月12日,主要目的:完成游戏的难度选择

*\

private void init() {

  this.board = new TetrisBoard();

  this.gameCanvas = new TetrisCanvas(this);

  this.activePiece = new TetrisPiece();

  this.completedRows = new boolean[TetrisConstants.HEIGHT]; //初始化数组

  this.hiScore = this.openAndReadHiScore();  

       this.nextPieceType = TetrisConstants.UNINITIALIZED;

       this.rand = new Random();

       // 设置exit/pause/resume命令

       this.setuPCommands();

       this.gameCanvas.addCommand(this.exitCommand);

       // 显示title屏

       this.setGameState(TetrisConstants.TITLE_STATE);

}

5.6 积分模块的实现 5.6.1 界面的实现

 飞机大战积分模块界面如图1-8所示。    

图1-8  积分模块

5.6.2 核心代码

    积分板实现代码如下:

\*

*   写于4月16日,主要目的:完成游戏的积分模块

*\

public void drawCount(Graphics g){

       g.setColor(Color.white);

       Font font = new Font("宋体", 1, 20);

       g.setFont(font);

       g.drawString("积分:" + this.score, 0, 470);   

}

实现积分的增长:

if (burst != null)

  burst.draw(g_off);

for (int i = 0; i < list.size(); i++) {

  Role chara1 = (Role) list.get(i);

  if (chara1.isDead()) {

       if (chara1 instanceof Enemy)

       {

            chara1.drawBurst(g_off);

            this.battle.score++;

       }

       list.remove(i);

  }

}

全屏爆炸时,计算炸死几个敌人增长分数:

if(GamePanel.skillCount>0){

       for (int i = 0; i < GamePanel.list.size(); i++) {

            Role chara1 = (Role) GamePanel.list.get(i);

            if(!(chara1 instanceof Battle) && chara1.x>0 && chara1.y>0    

          && !(chara1 instanceof BossA)  && !(chara1 instanceof BossB) 

          && !(chara1 instanceof BossC)){

                 GamePanel.list.remove(i);

                 if(chara1 instanceof Enemy){

                      this.score++;

                 }

实现积分的输出:

private void gameOver() {

       GamePanel.skillCount = 10;

       if (Key.enter) {

            gameMode = 12;

            stage = 1;

       } else {

            g_off.setColor(Color.white);

            Font font = new Font("黑体", 1, 28);

            g_off.setFont(font);

            FontMetrics fontMetrics = getFontMetrics(font);

            g_off.drawString("Game Over", (450 - fontMetrics

                      .stringWidth("Game Over")) / 2, (500 + fontMetrics

                      .getHeight()) / 2 - 50);

            String score = "Score: " + this.battle.score;

            g_off.drawString(score, (450 - fontMetrics

                      .stringWidth(score)) / 2, (500 + fontMetrics

                      .getHeight()) / 2 - 20);

            if (15

chara.x && x + 14F < chara.x +

               chara.WIDTH

                      && (y + HEIGHT) - 12F > chara.y

                      && y + 12F < chara.y + chara.HEIGHT) {

                 //如果碰到敌人,敌人死亡

                 chara.dead();

                 //如果碰到子弹血量减少

                 if (chara instanceof EnemyBeam){

                      power--;

                 }

                     

                 power -= 50;

                 if (power

= (float) app.getHeight())

                 y = (float) app.getHeight() - HEIGHT;

       }

       if (Key.up) {

            if (Key.xkey)

                 y -= (double) speed / 4D;

            else

                 y -= speed;

            if (y

ShootGame.HEIGHT;

      }

      /**移动,可斜着飞*/

      @Override

      public void step(){

             x+=xSpeed;

             y+=ySpeed;

             if(x>ShootGame.WIDTH-width){

                    xSpeed=-1;

             }

             if(x



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3