源码下载 http://www.byamd.xyz/hui-zong-1/
现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile
communication
,第四代移动通信技术)网络的深入,越来越多的IT行业开始向手机行业转移重心。而手机行业中游戏方面的利润所占比重较大,并且手机游戏大多数则是由Java语言开发研制的。所以我想顺应时代发展,用学到的Java知识对游戏进行一次深入的了解与创作。
Java语言在我们大学学习中占了很大的比重,其优点甚多:面向对象,可靠,安全,多平台可移植,高性能,多线程等。面向对象是相对于c语言的面向过程来说的,在面向对象编程中,我们用Java去新建一个对象,调用其方法就能实现我们的目标,并不需要了解这个对象的方法的具体实现过程;Java的可靠安全特点体现Java不支持指针,禁止第三方访问,杜绝了外部风险。所以使用Java开发游戏,是一个正确的选择。
大学学习即将结束,在毕业之际,我想用我4年里学习的知识为自己编写一个属于自己的游戏——飞机大战游戏,为我的大学生活画上圆满的句号。
关键词**:**Java游戏;面向对象;可靠安全;多线程
Design And Implementation Of Airplane Wargame Based On Java
Nowadays, with the emergence and popularization of smart phones, plus 4 g (the 4
th Generation mobile communication, the fourth Generation mobile communication
technology) the development of the Internet, more and more in the IT industry
began to shift to the mobile phone industry center of gravity. Aspect of the
game of the mobile phone industry profits account for a large proportion, and
most mobile game is developed by Java language. So I want to keep up with the
development of The Times, use Java knowledge for an in-depth understanding of
the game and creation.
Java language learning in our universities accounted for a large proportion of
its many advantages: Object-oriented, reliable, secure, multi-platform portable,
high-performance, multi-threading. Object-oriented process-oriented with respect
to the terms of the c language, object-oriented programming, specifically we use
Java to create a new object, call its methods will be able to achieve our goal,
we do not need to know the object’s method of implementation ; reliable safety
features reflect Java Java does not support pointers to prohibit third-party
access, to eliminate the external risk. Therefore, the use of Java development
aircraft war game, is the right choice.
University coming to an end, on the occasion of the graduation, I want to use my
four years studying knowledge and made themselves a game of their own - Aircraft
war game for my college life painting satisfactory conclusion.
Keywords: Java game; object oriented; reliable and secure; multi thread
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》仍然广受欢迎,各大应用商店的点击下载量还是很高,衍生出来的游戏更是数不胜数。
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的头盔设备即可完成指令的输入与输出。
本次项目的题目——基于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)玩家游戏控制功能
玩家可以通过控制移动鼠标或者键盘来控制友机的移动。
本文的组织结构如下:
第一部分介绍了本文的国内外背景。
第二部分介绍了开发游戏项目涉及到的软件平台与开发语言。
第三部分介绍了项目的需求分析。
第四部分介绍了项目各个模块的实现。
第五部分介绍了对软件测试的过程及结果,找到项目的优缺点。
2 开发平台与开发技术
本章主要介绍软件开发平台如何选择。本软件涉及到的开发平台是IntelliJ
IDEA,开发技术是Java技术。下面将会介绍一下选择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的最小屏幕分辨率。
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个可用的内置插件。
我们大学学习中,对于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的确是第一选择,它可以让你快速,方便地编写和修改代码,建议适当的函数,提供适当的方法。它不要求你准确选择表达式,但会猜测你想要做什么,。
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 可行性研究
可行性研究顾名思义,研究其的可行性。可行性研究是项目开发之前的重要阶段。在软件开发实践中,软件开发人员或者用户对市场的了解不充分,对技术的掌握不好,对进行开发的各项风险评估不足等因素,有些问题不能再预期下得到解决,造成不可预估的损失,为了避免盲目的软件开发和不必要的损失,相关人员需要对开发特定软件项目的可行性进行研究,结合资金、时间和环境等各方面的制约条件,对该软件产品是否能够解决存在的问题,是否能够带来预期的效果和价值做出评估。
现在开发游戏的语言一般都是Java语言,为了保证开发出来的游戏可以在手机、Web浏览器、PC客户端等平台使用,所以就要求开发语言可以在多平台移植,而Java语言刚好符合这个特性。开发工具IntelliJ
IDEA可以下载并且可以免费使用,Java的编译工具JDK也可以在Sun官网上直接下载安装,其过程十分简单。
配置较低的电脑也能进行Java游戏的开发,一台电脑就行,开发成本低。由于Java具有跨平台以及一次编译,到处运行的特点,开发出来的游戏可以放到各大游戏平台上发售,玩家可以在电脑,浏览器,手机等各种平台运行。而且软件维护简单,实用性强,一次开发使用,即可长久使用,当软件满足不了用户需求时,只需对用户的需求进行添加即可。
本游戏操作简单,在电脑和浏览器上可以用鼠标键盘操作,在手机上可以用手触摸屏幕运行。
本软件操作简单,对用户的要求,不需要多强技术能力。
信息产业部已将游戏通用引擎研究及示范产品纳入国家“863计划”,这是中国首次将游戏技术纳入国家科技计划当中。
需求分析是对即将开发的系统确定一个完整的,准确的要求。需求分析的结果是否完美解决了用户的问题,将直接影响到后面的进程,并影响到设计结果是否能让用户接受。软件需求分析对软件系统提出了清楚、准确、全面而具体的要求,是对软件使用者意图不断进行揭示与准确判断的过程,它并不考虑系统的具体实现,而是严密地、完整地描述了软件系统应该做些什么的一种过程。
飞机大战主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐。我方飞机可以随意移动,敌方飞机无规律出现。游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就一直能发射子弹,当我方子弹碰到敌方飞机时,敌方飞机消失。当玩家飞机碰到敌方子弹时,生命值减一,直到玩家飞机生命值为一时,游戏结束。
基于Java的飞机大战游戏的设计与实现有以下几个模块:
(1)游戏状态控制功能模块
(2)游戏难度的调整模块
(3)游戏界面绘画功能模块
(4)玩家游戏控制功能模块
游戏的状态控制包括运行及结束游戏,首先进入游戏的开始页面,在游戏进行时,玩家必须躲避或者击落敌方飞机,玩家飞机的生命值降低为0的时候游戏就会结束,弹出游戏结束界面。
玩家玩的时间越长游戏的难度越高,敌方飞机的数量越多、敌方飞机出现的频率越高,玩家保证飞机的存活的难度越高,操作难度相应也高。
左上角会显示玩家飞机当前生命值,游戏时间,当前分数,其他地方用来输出玩家对我方飞机的控制与敌方飞机的动作显示
玩家可以通过控制鼠标或者键盘来控制方飞机(Hero airplane)的移动。
清新靓丽的游戏界面将给用户带来愉悦的美感。因此,在这个游戏中,主要参考原始的游戏画面,敌我飞机的形象也应该是美丽的。
应用程序线程机制的基石,实现了游戏,游戏的刷架的控制,装上各种角色的资源和背景(如飞机,机友)的要求,以实现整个游戏实现自动控制线程
控制。
例如,敌方飞机与玩家飞机防碰撞,敌方飞机与玩家飞机防碰撞,等等。防碰撞检测技术实现在不同情况下,有不同的防碰撞检测方法。
用图片的阵列,动画切片变换形成。图像阵列,千变万化的图像画在画布标,使动画,这是一个图像的形成阵列。使用切片来实现动画,所有的帧都放置在相同的图像中,以达到爆炸的效果。
音效资源文件
R.java 回调方法
子弹,敌机
类文件
SurfaceHolder
Callback接口
SurfaceVIew
界面
图片资源文件
图1-1 飞机大战游戏的模型图
图1-2 飞机大战游戏的软件功能模块图
飞机大战的界面如图1-3所示。
图1-3 飞机大战游戏开始界面
游戏开始的流程图如图1-4所示。
图1-4 游戏初始化流程图
游戏初始化代码如下:
\*
* 写于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);
}
}
飞机大战的开始界面如图1-5所示。
图1-5 飞机大战开始界面
流程图如图1-6所示。
图1-6 游戏开始模块程序流程图
下面是游戏开始模块的功能代码,如下:
\*
* 写于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;
}
发射子弹界面实现如图1-7所示。
图1-7 发射子弹界面
流程图如图1-8所示。
图1-8 发射子弹模块程序流程图
发射子弹实现代码如下:
\*
* 写于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);
}
飞机大战积分模块界面如图1-8所示。
图1-8 积分模块
积分板实现代码如下:
\*
* 写于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 <= current % 50)
g_off.drawString(“请按 回车”, (450 - fontMetrics
.stringWidth(“请按 回车”)) / 2,
(500 + fontMetrics.getHeight()) / 2 + 100);
}
}
判断飞机是否中弹的逻辑非常简单就是在绘制飞机与子弹的时候判断两个图片是否存在重合的部分,如果存在则玩家生命值减一,之后将中弹飞机从飞机队列中删除,子弹同样的处理。
防碰撞逻辑核心代码如下:
\*
* 写于4月24日,主要目的:完成游戏的防碰撞模块
*\
public boolean checkHit(Role chara) {
if ((chara instanceof EnemyA) || (chara instanceof EnemyB)|| (chara
instanceof EnemyC) || (chara instanceof EnemyShot)) {
if ((x + WIDTH) - 14F > 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 <= 0) {
dead();
//绘制爆炸图片
GamePanel.burst = new Burst(x, y);
}
return true;
}
本游戏操作采用鼠标/键盘的移动来实现玩家飞机的移动。
游戏操作实现代码如下:
\*
* 写于4月23日,主要目的:完成游戏的游戏操作
*\
public void move() {
oldx = x;
oldy = y;
if (Key.left) {
if (Key.xkey)
x -= (double) speed / 4D;
else
x -= speed;
if (x <= 0.0F)
x = 0.0F;
}
if (Key.right) {
if (Key.xkey)
x += (double) speed / 4D;
else
x += speed;
if (x + WIDTH >= (float) app.getWidth())
x = (float) app.getWidth() - WIDTH;
}
if (Key.down) {
if (Key.xkey)
y += (double) speed / 4D;
else
y += speed;
if (y + HEIGHT >= (float) app.getHeight())
y = (float) app.getHeight() - HEIGHT;
}
if (Key.up) {
if (Key.xkey)
y -= (double) speed / 4D;
else
y -= speed;
if (y <= 0.0F)
y = 0.0F;
}
\*
* 写于4月30日,主要目的:完成游戏的特殊NPC的添加
*\
package com.tarena.fly;
import Java.util.Random;
/**蜜蜂*/
public class Bee extends FlyingObject implements Award{
private int xSpeed=1;//x坐标移动速度
private int ySpeed=2;//y坐标移动速度
private int awardType;//奖励类型
/**初始化数据*/
public Bee(){
this.image=ShootGame.bee;
width=image.getWidth();
height=image.getHeight();
y=-height;
Random rand=new Random();
x=rand.nextInt(ShootGame.WIDTH-width);
awardType=rand.nextInt(2);//初始化时给奖励
}
/**获得奖励类型*/
public int getType(){
return awardType;
}
/**越界处理*/
@Override
public boolean outOfBounds(){
return y>ShootGame.HEIGHT;
}
/**移动,可斜着飞*/
@Override
public void step(){
x+=xSpeed;
y+=ySpeed;
if(x>ShootGame.WIDTH-width){
xSpeed=-1;
}
if(x<0){
xSpeed=1;
}
}
}
测试是处在开发阶段的最后部分,是保证软件质量的重要手段。软件测试是一个软件应用程序或一个所谓的条件处理和评估在控制条件(包括正常条件和非正常条件)下操作并评价其结果的过程。软件测试过程中应当故意诱导程序发生错误,正常情况下它虽然不应该存在,但是不确定它有可能在任何时候出现。从本质上说,软件测试是“探测”发现“探针”的问题。
软件测试是一项为了给利益相关方提供有关产品质量或者是正在测试的服务的信息而进行调查的过程。软件测试也可以提供一个客观,独立的视角来看待软件,以便让企业知晓并理解软件实现过程中可能存在的风险。软件测试技术是一种带着为了发现软件或者程序的BUG(错误或者其他的缺陷)的态度来运行一个程序或者应用的过程。
软件测试涉及一个软件组件或系统组件的执行,以评估所关注的对象的一个或多个属性。在一般情况下,这些属性表明该组件或系统被测试的程度:
1.满足其设计和发展的需要。
2.对各种输入进行正确的相应。
3.在用户可容忍的时间内实现其功能。
4.所有功能都能满足使用。
5.可以在预定的环境中完美安装并运行。
6.可以实现如其利益相关者所期望的正常结果。
由于即使对简单的软件组件所进行的测试数量都是数量巨大的,所有的软件测试都运用一些策略去挑选那些无论在时间是对资源都是合适的测试用例。其造成的结果是,软件测试通常(但也不排除其他情况)尝试着带着为了发现软件BUG(错误或者其他的缺陷)的态度来运行一个程序或者应用。当BUG不被解决时,需要反复进行软件测试的工作。它可能解决其他更深层次的BUG,但也可能会使得程序出现新的BUG。
软件测试可以为用户和赞助商提供有关软件质量和可能存在的风险等级的信息。当然,这种信息是相对客观,独立的。
软件测试可以为用户和赞助商提供有关软件质量和可能存在的风险等级的信息。当然,这种信息是相对客观,独立的。例如,例如,在软件开发的不同阶段,大部分的测试工作总是在系统需求已经被明确定义时才开始的,然后在测试过程中实现。与此相反,Agile(敏捷开发,是一种对于经常被用于在线应用程序的开发模型的涵盖性术语)方法下,需求,分析,编程和测试经常同时进行。
尽管测试可以在某些特定假设的前提下,确定了软件的正确性,但是测试还是不能找出软件中所有的缺陷。相反,有些人也许可能会注意到这些问题,它对产品的申明和行为进行评论或与其他产品对照比较,看是否违反了Oracle公司的原则。这些Oracle的原则可能包括(但不限于)规范,合同,类似的产品,过去同一版本的产品,预期的计划或预期的目的,用户或客户的期望,相关标准,适用法律或其他标准。
测试的主要目的是检测软件故障,使得缺陷被发现并且纠正。测试不能证明在所有条件下,软件或者程序都能正常的运行,它只能检测到在某种特定情况下,软件或者程序不能正常工作。软件测试的范围通常包括代码的检查以及在各种环境和条件的代码的执行情况以及检查的代码功能:什么是它应该做的,如何让它做需要它做的。在软件开发的当前环境中,检测团队可以独立于开发团队之外。从软件测试得出的信息可被用来校正开发软件的过程,防止出现无法挽回的错误。
每个软件产品都有一些特定的用户。例如,用户对视频游戏软件和银行软件有完全不同的看法。因此,当一个组织开发或以其他方式投资一个软件产品时,软件测试可以评估它的最终用户,购买者或者其它利益相关者是否会接受该软件产品。软件测试是试图评估这一信息的过程。
并非所有的软件缺陷是由编码错误引起的。往往因为一些错误会付出巨额的代价,这些错误常见的原因之一就是出现在需求方面,例如,程序员没有完全理解需求,从而导程序设计开发时与用户出现分歧。需求的差距往往来自非功能性需求,如可测试性,可扩展性,可维护性,可用性,性能和安全性。
软件故障,在下述情况是发生:程序员犯了一个错误(失误),这将导致在本软件的源代码中出现一个缺陷(故障,错误),如果执行这种有缺陷的代码,在某些情况下,系统会产生提示出现错误,从而引起了故障。当然并非所有缺陷都将导致故障的发生。例如,死代码缺陷永远不会导致故障。当环境变化时的缺陷可以成为一个失败的关键。这些在环境变化的例子中包括软件在新的计算机硬件平台运行,源代码的改变,或用不同软件进行交互,一个简单的缺陷可能导致一个软件的失败。
软件测试的基本问题是:即使一个简单的产品,用所有的输入组合和先决条件(初始状态)进行测试是不可行的。这意味着一个软件产品的缺陷数量可以是非常巨大的,而且很多缺陷是难以在测试中发现的。更重要的是,非功能性的属性(它应该做什么与它如何做)如
可用性,可扩展性,性能,兼容性,可靠性是高度主观的;
一个人可能接受其中一个属性的价值却不能认同另外一个。
软件开发人员无法测试所有的东西(所有的输入组合和先决条件),但他们可以使用组合测试设计,来确定他们想要覆盖测试所需的最小数量。组合测试设计,使用户用很少的测试用例能够获得很大的测试覆盖率。他们可以使用组合测试设计的方法来构建他们的测试用例,是他们的测试速度与测试深度有很大的提升。
软件测试可用许多方法。回归,演练,或校对被称为静态测试,而实际执行程序代码与给定的测试案例被称为动态测试。静态测试往往是隐含的,如校对,再加上编程工具/文本编辑器查看源代码结构或编译器(预编译器)检查语法和数据流的静态程序分析。当程序在运行时动态测试发生。动态测试可以在程序100%完成前开始测试,以便测试特定的代码,也可以应用于分散的功能或者模块中。这个典型的技术使用https://en.wikipedia.org/wiki/Method_stub驱动程序或在调试环境下执行。
程序测试的主要方法分为两大类:白盒测试和黑盒测试。
白盒测试(也称为清晰盒测试,玻璃盒测试,透明盒测试和结构测试)可以观察源代码,测试内部结构或程序的运作,而不是暴露终端用户的功能。白盒测试系统,用于设计测试用例,以及透视内部编程的技巧。测试器通过选择路径输入代码来确定相应的输出。这类似于在测试一个电路节点,例如:电路测试(ICT)。
而白盒测试可以应用于单元测试,集成测试和系统测试的软件流程,但是它通常在单元级别进行的。它可以在集成单元和子系统之间的测试路径上进行系统级别的测试。虽然这种方法测试设计可以发现许多错误或问题,但是它可能无法规范检测到或遗漏需求分析未实现的部分。
在白盒测试中使用的技术包括:
API测试
-通过公共和私人的应用测试的API(应用程序编程接口)
代码覆盖率
-创建测试,以满足代码覆盖率的一些标准(如:测试设计人员
可以创建测试,以使程序中所有的语句至少执行一次)
故障注入方法-有意引入故障来衡量测试策略的效果
突变检测方法
静态测试方法
代码覆盖工具可以评估任何方法,包括创建了一个完整的测试套件的黑盒测试方法。这允许软件团队可以很少对测试进行检查,只确保对最重要的一个系统的部分功能点进行检验即可。代码覆盖率常作为衡量测试好坏的指标,甚至用代码覆盖率来考核测试任务完成情况:
功能覆盖,函数是否执行
语句覆盖,语句是否执行
判定覆盖,对程序中每个判定条件的真分支和假分支至少进行一次判定
100%的语句覆盖,确保所有的代码路径或分支(在以下方面控制流程)至少执行一次。这对于确保功能的正确有很大的帮助,但是对于相同代码有可能因为输入的不同而有不同的结果。
黑盒测试把软件作为一个“黑盒子”,具有审查的功能,而有关内部实现的任何细节都不清楚,也看不到其源代码。该测试人员只了解该软件的功能与作用,而不清楚它是如何具体实现的。黑盒测试方法包括:等价类划分,边界值分析,全局测试,状态表转移,决策表测试,模糊测试,基于模型的测试,用例测试,探索性测试和基于规范的测试。
基于规范型的测试旨在去测试软件关于适应性要求方面的功能。这种级别的测试通常需要测试人员提供全面的测试用例,然后只需验证其中一个给定的输入值,输出值(或行为),不管在测试用例中与期望结果是否相同。测试用例的选取是建立在规范和要求下的,也就是说,应用程序应该做什么。它使用的软件的外部描述,包括规格,要求,和设计以获取测试用例。这些测试虽然有时有用,有时无效,但是通常是有用的。
基于规范的测试可能只能检测其功能的有效性和正确性,但它不足以应对复杂或高风险的情况。
黑盒测试技术的一个优点是不需要专业的编程知识。即使编写程序的编程人员与测试人员有鸿沟一般的编程差距,但是测试人员总能从不同的方面给出相应的建设性意见。在另一方面,黑盒测试的过程可以被说成是“摸着石头过河。”
因为不需要检查程序的源代码,所以在某种情况下,测试人员需要写很多测试用例来检查程序,但是该程序只能被一种测试用例来测试或者只能测试程序的部分功能。
测试的这种方法可以应用到软件测试的各个方面,例如:单元测试,集成测试,系统测试和验收测试。它虽然不能包括测试过程中的所有流程,但是在单元测试中却保持着绝对的优势。
软件评价是指软件在正式运行了一段时间之后,对它在功能上、技术上和经济上所进行的审核评价。针对本软件的评价如下:
(1)软件功能评价
根据这套软件开发前的目标,试运行完成后软件后,软件达到了预定的发展目标,在实际使用功能可满足用户的需求。
(2)软件技术评价
该软件设计合理,功能达到预期目标,软件后运行稳定,可靠,安全,实用。
(3)软件经济评价
在规定时间内,该软件完成后,软件分析,以确定软件的发展目标,符合设计要求,投入使用,为用户节省了大量的人力,物力和财力,提高科学管理水平。
本次毕业设计到此已经顺利结束。通过这次毕业设计,我学习到了很多东西。在以前的三年课程中我学到了很多课程,从开始的计算机理论基础,到C语言,数据结构,C++,Java,数据库系统概论等。虽然通过学习对这些课程都是比较肤浅的了解,而且也只是停留在堆理论只是的理解阶段,对其掌握程度还不够前面和熟悉。这次毕业设计,使我将大学四年中所学的课程贯穿整合起来,同时在设计中还涉及到一些之前没有学习过的新知识。对这些新知识的学习培养了我快速自学和应用新知识的能力。本次毕业设计不仅仅是我对所学知识的一次综合应用,更是对我综合分析试剂问题、处理实际问题的能力的培养和锻炼。
本次设计运用了Java相关知识及软件工程的思路进行开发。在实现功能的同时更加侧重于对开发Java游戏的研究。由于时间、条件有限,经验不足等,本文所做的工作还有很多不足之处,还需要进一步学习和研究。
[1]杨大生, 陈忠. 基于Symbian平台飞机大战游戏设计[J]. 福建电脑,
2010(07):140-140
[2]谢海军. 基于Java的手机游戏引擎的研究及实现[D]. 西南交通大学, 2007.
[3]马鹏强. 基于J2ME的手机五子棋游戏设计与实现[D]. 电子科技大学, 2012.
[4]周凤英, 文惺. Java游戏开发起步[J]. 电脑爱好者, 2003(14):116-116.,
[5]陈立伟. 精通Java手机游戏与应用程序设计[M]. 中国青年出版社, 2005.
[6]丁知平, 罗光华, 陈传起,等.
基于项目驱动的Java手机游戏开发教学方法的探讨[J]. 科技信息:科学教研,
2008(7):208-208.
[7]陈小玉. 基才J2ME的Java手机游戏开发实例[J]. 电脑编程技巧与维护, 2005.
[8]Ross J M. Guiding students through programming puzzles: value and
examples of Java game assignments.[J]. Acm Sigcse Bulletin, 2002,
34(4):94-98.
[9]Wang Y H, Wu I C, Jiang J Y. A portable AWT/Swing architecture for Java
game development[J]. Software Practice & Experience, 2007, 37(7):727–745.
[10]Zhu Y. Design and implementation of a Java game applet[J]. Computer
Science & Software Engineering, 2002.
本研究及学位论文是在我的导师的亲切关怀和悉心指导下完成的。从课题的选择到论文的最终完成,老师都始终给与我细心的指导和不懈的支持,老师为人随和热情,多次询问我的毕设进程,为我指点迷津,帮助我开拓新的思路,精心点拨。老师一丝不苟的作风,严谨求实的态度,踏踏实实的精神,让我受益终生。正是由于老师的帮助与鼓励,我的毕业论文才能够得以顺利完成。在即将答辩之际,老师还传授我答辩的技巧与知识,为我指出了论文中的不足,并手把手指导修改论文。再此,谨向老师表示崇高的敬意和衷心的感谢。
感谢我的同学在我创作论文的道路上提供的帮助,他们给予了我很大的帮助,让我将很多快要遗忘的知识加深了一次,并指出了我很多的缺点,让我及时改正。
感谢学校为我提供了很好的住宿环境,让我可以心情舒畅,学习效率翻倍。
感谢我的家人多次电话给与我帮助,给予我支持。
再次感谢所有为我提供帮助的所有人。
Java Game Development Status and Trend
These years due to the continuous development of Java technology, Java programs
run speed has been significantly improved, while also continue to progress in
hardware technology, which makes treatment more complex Java 3D graphics
possible. Appears Lwjgl, Jogl, Java3D and other technologies, so you can easily
use Java language is now increasingly powerful graphics hardware acceleration.
In fact there are already many Java-based 2D and 3D games, many of whom are
massively multiplayer online games. The above are just a small part of the Java
games. However, even if there are many other Java-based games, relative to the
entire gaming industry is concerned, Java gaming community is still very small,
so that its strength in areas outside of mobile games can be almost negligible.
But in fact Java as a programming language and platform games, or these years
has made considerable development in the era after the applet walked the road to
recovery.
Of course, Java can do games, does not mean that Java suitable for playing
games, then:
Java for a game of significance
1. Java is an after full development has been very mature language
Java language dominate the enterprise applications for so many years, it has
proved very suitable for large-scale software development. When the Java run
time efficiency is no longer a problem, Java language rigorous, high
abstraction, readable advantage is manifested. This increasingly large scale
game software, with no small temptation.
2. Java as a platform, which greatly facilitates the use of the game script
For game developers, because the case involves more complex (and sometimes even
aesthetic issues), development process many times is a constant process of
revision, you can easily modify the game content is critical. For something a
lot of game engines have their own written script interpreter, to explain some
custom game scripting language (usually command-style script, such as moveplayer
(int x, int y), playersmile () like ), while others provide, for example, and
the like lua scripting language to access rubby game engine. Due to its
characteristics of a virtual machine, Java itself can be used to write the game
script, for example, currently beanshell, groovy and other scripting languages
can be easily and seamlessly interact with Java language, which are greatly
facilitate the Java game programming.
3. Cross-platform
Cross-platform, Java and time whenever compare other languages, always talking
about cross-platform. However, Java gaming, write once, run everywhere, it
sounds more like a joke. This joke how cold it? (I am not familiar mobile phone
games, but does someone with “painful” to describe developed to run on different
mobile phone Java game game) for most other Java games, or to deploy or through
Java web start applet by two without exception, to be used in the way the
browser. For Java web start, the problem is relatively small, the programmer
must deal with the main problem is how to make non-professional users to
successfully install the JRE version specified the problem, although a lot of
trouble, but it can be solved. For the applet, the problem becomes more complex,
many problems only when a specific browser to appear in a particular operating
system coupled with even the same brand of browser, different browser versions
will also appear different problems, while there is also the client default is
to use opengl pipeline or directdraw pipeline problems. And we have not even
begun to discuss the game when the 3d graphics API underlying need to use the
time, whether it is or web start applet used once in any program opengl the Java
binding, the client is different and the same graphics graphics cards will bring
the different drivers of different problems, and these problems are as different
operating systems and browsers and different operating system a few × browser
several (web start does not need to consider browser) × × per card number the
average of several graphics driver version = nightmare. Finally, you have to
compromise on such a reality ----- even computer hardware to meet the
requirements of the program, you cannot make your application run in every stage
of these computers, unless your users are professionals.
Of course, in fact, the status quo does not sound so bad, do not use Java for
most games, there is only run on a platform of many games directx or opengl
version is required, not to mention those running in the home game consoles on
the cross-platform is a major problem throughout the games industry, Java is
just like everyone else does not solve this problem out of it, but still doing
better than other techniques. However, it is worth mentioning that in those not
directly using hardware-accelerated web games, Java is indeed in the stability
and ease of installation on the lost flash; in the console aspect, Java is 0,
and Microsoft’s XNA
(C#) across Xbox360 and Vista.
4. Network
Java has always been strong in terms of problem-solving network, in this regard,
Java has two main advantages, first is based on the applet and the Java web
start of the game is very easy to update, not like other games that require
users to manually download the new version; the first Second, Java is relatively
friendly and interactive network API, and for large-scale online games, the
distributed system is very important, this is the JCP giants like, probably
because this is a good opportunity to sell hardware, Sun under a lot of effort
to develop the project dark star online game server to do, since the project has
yet to 1.0, so now it is difficult to say specifically good or bad.
5. Speed
This is nothing to discuss, Java-based pay huge games would surely be
well-written C ++ program slowly, of course, to write a good C ++ program takes
also Java cannot compare.
The main technical Java games
1. Java3D
The company introduced earlier as a Sun 3d technology, is a highly encapsulated
API, opengl and built on direct3d, arguably the most famous of the 3d Java
technology. For various reasons (API design for users is not clear), Java3d has
no way to popular, recent Java3d team announced the suspension of the
development of new features for Java3d favor of 3d rendering engine for the Java
FX development. While another project project Sun’s wonderland announced it is
rendering engine from the Java3d into JMonkeyEngine. It is sad that once again
into the Sun’s Java3d dusty state, a large number of programs and tutorials
based Java3d are facing a very awkward position; good news is finally in this
area better than the Sun appeared in the team. Others cited the evaluation of
the matter: Java3D is dead Long live Java “3D”!!
2. Lwjgl
Full name is light weight Java game library. As an unofficial Java games on a
comprehensive solution, lwjgl the game graphics (opengl), audio (openal), a
control input is set to become directx Java community (not direct3d) efforts.
Which uses a Java binding on opengl graphics, its function and c language
version of the same, so for programmers accustomed to opengl programming more
friendly. There are a large number of Java games and game engine is based on
lwjgl, it can be said that Java gaming community is one of the most widely used
by the library.
3. Jogl
Jogl is a Java binding on opengl, opengl or a Java implementation of the
interface, which is supported by the Sun. The syntax is exactly the same as
opengl, API also keep up with the updated version of opengl, but most of Nehe’s
opengl example programs have jogl version. Last year jogl formal review by jcp
become jsr231, is the main competitor of lwjgl. It is worth mentioning that the
project leader Ken Russell had jogl declaration does not want to become part of
the JRE jogl, because he thought this would jogl update cycle and the same JRE,
so that it becomes too slow. Ken Russell is currently operating at full capacity
in the new Java plug-in development, while the API opengl did not change, so now
jogl version will last for a long period of time.
4. Joal
Java for openal of a binding solution is a Java sound.
5. Jinput
Java for non-standard input devices (gamepads, joysticks) solutions.
6. JMonkeyEngine
JMonkeyEngine is an open-source Java game engine, the underlying height package,
after 4 years of development, in October last year has finally released the 1.0
version. Posted in Java 2007 conference on quite shocking demonstration video so
broad interest, it said that many screen effects are also the venue by its
completion. At the bottom, JMonkeyEngine adopted lwjgl, while jogl may be
supported in version 2.0. Last year, the famous online game company NC Soft
(developers Paradise Series, Guild Wars, City of Heroes, Tabula Rasa and other
game) will JMonkeyEngine three major developers move into the arm, perhaps in
the near future we can see the engine commercial version. It is worth mentioning
that, after serving NC Soft, the main developer of the engine now claimed to
have more time for open source version of game engine development, and the
current speed of development JMonkeyEngine indeed significantly improved 2.0
edition possible 2008 will be released later for some time. In addition, the
development project wonderland by the Sun will make its rendering engine,
recently announced by the Java3d into JMonkeyEngine, so JMonkeyEngine further
attracted widespread attention.
7. Project Dark Star
Currently Project Dark Star to version 0.95, is designed for applications Sun
online game aspect of the development. This project focuses on solving
large-scale distributed application of game servers, personal feeling is similar
to network game applications j2ee. For general game network transmission,
Project Dark Star also gives his own solution. But many people think that Dark
Star game does not try to simplify common network applications, because the
project is mainly on large-scale distributed applications online game servers to
resolve, so as to promote sales of Sun own production servers. Of course, I did
not really used or studied it, just hearsay, it is likely to have errors.
8. Project Wonderland
Sun developed a 3d virtual world building tools, Sun using the project created a
virtual working environment MPK20, physically in different continents, people
can work together in this virtual world in a room, this project demonstrates a
very good video , it is recommended to look at the home page.
Future:
Java games for now there has been no significant upward trend, in addition to
mobile phones outside the game, Java game basically in a dormant state. Java
game may usher in the next several opportunities:
1. Java SE 6 Update N (before called “Consumer JRE”) issued
In this new version, Sun claims to it will make Java upgrade is more convenient
to deploy more simple (easy to detect client Java version, and install the
program requires version), users will be able to install only JRE part they need
for being less than the part can wait and use the time to install, while
accelerating the speed of Java virtual machine starts (actually just opened in
the machine when the computer start Java virtual machine, rather than in the
first run when the Java program) , increase swing hardware acceleration support.
The new Java plug-in applet will greatly enhance the stability, reliability,
will allow the applet to change the size of memory they can use, choose which
specific version of JRE execution.
In fact become stable once the Applet, Java will reflect the face of Flash huge
performance advantage, so Java SE 6 Update N release will be the biggest
opportunity within Java game industry for some time.
2. Java FX release
Java FX’s goal is to make Java FX like Flash as easy to develop, if the project
really successful, the Java game impact will be very great (but due to lack of a
convenient development tool Flash have, I Java FX successful the possibility of
doubt it)
3. Sony or Nintendo decided to support Java in the home console
The hope is very slim, but do take into account Microsoft’s XNA platform for
cross windows and Xbox360, maybe Sony PS3 repeated defeats in the case will
consider support for Java. In fact now it is the computer game consoles, many
enthusiasts have been able to run Java programs on the PS3 and WII, but cannot
use these machines currently Java hardware acceleration.
4. The further development of mobile phone
Now it seems the function of mobile devices has become increasingly powerful,
mobile phone performance may in the near future to achieve the standard
computer, mobile games market will occupy an increasing share of the game, due
to the wide variety of mobile phone operating system, cross-platform Java will
naturally become increasingly popular.
这些年由于Java技术的不断发展,Java程序的运行速度有了显著提升,同时硬件技术也在不断进步,从而使得Java处理比较复杂的3D图形成为可能。Lwjgl,Jogl,Java3D等技术的出现,使Java语言可以方便的利用现在的显卡日益强大的硬件加速能力。实际上目前已经有许多基于Java的2D和3D游戏,其中不乏大型多人在线游戏。上面这些只是Java游戏的小部分。然而,即使还有其它很多基于Java的游戏,相对于整个游戏产业来说,Java游戏社区仍然非常小,以至于其力量在手机游戏之外的领域几乎可以被忽略不计。但是实际上Java作为一种游戏编程语言和平台,这些年还是取得了长足的发展,在后applet时代走着复兴之路。
当然,Java可以做游戏,并不意味着Java就适合做游戏,那么:
Java对于一个游戏的意义
1. Java是一门经过充分发展,已经十分成熟的语言
Java语言称霸企业级应用这么多年,事实证明了它非常适合于开发大型软件。当Java的运行效率不再是问题的时候,Java语言严谨、高抽象、可读性强的优势就体现出来了。这对于规模越来越庞大的游戏软件来说,有着不小的诱惑。
2. Java作为平台,极大的方便了游戏脚本的使用
对于游戏开发来说,由于涉及到比较复杂的情况(有时候甚至是美学问题),开发过程很多时候是一个不断修改的过程,可以方便的修改游戏内容是十分关键的。对于很多游戏引擎来说,都有自己编写的脚本解释器,用来解释一些自定义的游戏脚本语言(一般为命令式脚本,比如moveplayer(int
x,int
y),playersmile()之类的东西),另一些则提供例如lua和rubby等的脚本语言来访问游戏引擎。由于其虚拟机特性,Java本身就可以用来编写游戏脚本,目前也有例如beanshell、groovy等脚本语言可以方便的无缝的和Java语言进行交互,这些都极大的方便了Java游戏编程。
3. 跨平台
跨平台,每当比较Java与其他语言的时候,总是要谈到跨平台。但是在Java游戏领域,write
once ,run
everywhere,听起来更像是一个冷笑话。这个笑话有多冷呢?(手机游戏我不熟悉,但是确实有人用“痛苦”来形容开发运行在不同手机上的Java
game游戏)对于其他大多数Java游戏来说,或者通过applet或者通过Java web
start来部署,这两种方式无一例外的都要用到浏览器。对于Java web
start来说,问题相对较小,程序员必须处理的问题主要是如何让非专业用户成功安装指定的JRE版本的问题,虽然很麻烦,但是可以解决的。对于applet来说,问题就变得复杂的多,很多问题只会在特定的操作系统配上特定的浏览器时才会出现,即使是同一品牌的浏览器,不同的浏览器版本也会出现不同的问题,同时这里还涉及到客户机默认是使用opengl
pipeline还是directdraw
pipeline的问题。而我们现在甚至还没有开始讨论当3d游戏需要使用底层图形API时的情况,无论是applet还是web
start一旦在程序中使用了任何一种opengl的Java绑定,客户机各不相同的显卡以及同一款显卡的不同驱动都会带来不同的问题,而这些问题是随着操作系统和浏览器的不同而不同的,操作系统数×浏览器数(web
start不需要考虑浏览器)×显卡数×每款显卡的平均的驱动版本数=噩梦。最后你不得不妥协于这样一个现实-----即使电脑在硬件上满足程序的要求,你也无法让你的程序运行在这些电脑中的每一台上,除非你的用户都是专业人士。
当然,其实现状并没有听起来那么糟糕,对于不使用Java的大多数游戏来说,根本就只能运行在一个平台上,许多游戏对directx或者opengl的版本有要求,更不要提那些运行在家用游戏机上的游戏了,跨平台是整个游戏业的大问题,Java只是像其他人一样没有把这个问题彻底解决掉而已,但仍然比其它技术做得要好。不过,值得一提的是,在那些不直接使用硬件加速的网页小游戏上,Java确实在稳定性和方便安装上输给了flash;在家用机方面,Java是0,而微软的XNA(c#)可以跨Xbox360和Vista。
4. 网络
Java一向强于解决网络方面的问题,在这方面,Java主要有两个优势,第一是基于applet和Java
web
start的游戏非常容易更新,不会像其他游戏那样需要用户手动下载全新版本;第二是Java在网络交互的API相对比较友好,而对于大型网络游戏来说,分布式系统非常重要,这正是JCP的巨头们喜欢的东西,可能由于这是一个卖硬件的好机会,Sun下了不少功夫开发了project
dark
star来做网络游戏服务端,由于这个工程还没有到1.0,所以现在也很难说具体好用不好用。
5. 速度
这个没什么可讨论的,基于Java的游戏肯定会比写得很好的C++程序慢,当然写一个好的C++程序所花费的庞大的薪水也是Java不能比的。
Java游戏方面主要的技术
1. Java3D
作为Sun公司较早推出的一项3d技术,是一种高度封装的API,构建在opengl和direct3d之上,可以说是最有名的Java的3d技术。由于种种原因(API设计,面向的用户不明确),Java3d一直没有办法流行,不久前Java3d的团队宣布暂停对Java3d新功能的开发,转而为JavaFX开发3d
渲染引擎。同时Sun的另一个项目 project
wonderland宣布将其渲染引擎由Java3d转为JMonkeyEngine。令人唏嘘的是Sun的Java3d再次进入尘封状态,大量基于Java3d的程序和教程都面临一个非常尴尬的境地;令人高兴的是在这一领域终于有比Sun做得更好的团队出现了。引用别人对此事的评价:Java3D
is dead! Long live Java “3D”!
2. Lwjgl
全名为light weight Java game
library。作为一个非官方的对Java游戏的全面解决方案,lwjgl将游戏图形(opengl)、音效(openal)、控制输入集合为一,以成为Java界的directx(不是direct3d)而努力。其在图形方面采用了opengl的Java绑定,其函数与c语言版的完全相同,所以对于习惯opengl编程的程序员来说比较友好。目前有大量的Java游戏和游戏引擎是基于lwjgl的,它可以说是Java游戏社区最广为被使用的函数库之一。
3. Jogl
Jogl是Java对opengl的一个绑定,或者说是opengl接口的Java实现,它是由Sun支持的。其语法与opengl完全相同,API也紧跟随着opengl的版本进行更新,而Nehe的opengl范例程序大多数都有jogl版本。去年jogl正式通过jcp审核成为jsr231,是lwjgl的主要竞争者。值得一提的是,jogl项目的领导者Ken
Russell曾经声明并不希望jogl成为JRE的一部分,因为他认为这样会使jogl的更新周期与JRE相同,从而变得过于缓慢。Ken
Russell目前全力工作在新的Java
plug-in的开发上,而opengl的API也没有进行更改,所以现在的jogl版本将持续较长的一段时间。
4. Joal
Java对openal的一个绑定,是Java音效的一个解决方案。
5. Jinput
Java对非标准输入设备(游戏手柄,操纵杆)的解决方案。
6. JMonkeyEngine
JMonkeyEngine是一个开源Java游戏引擎,对底层高度封装,经过4年的开发,在去年的10月终于发布了1.0版本。在2007的Java会议上发布了相当震撼的演示视频,从而广受关注,据说会场的许多屏幕特效也是由它完成的。在底层,JMonkeyEngine采用了lwjgl,而jogl可能会在2.0版本中得到支持。去年著名的网络游戏公司NC
Soft(天堂系列,激战,英雄城市,Tabula
Rasa等游戏的开发商)将JMonkeyEngine的三位主要开发人员招入麾下,也许不久的将来我们就可以看到这一引擎的商业版本。值得一提的是,在任职NC
Soft之后,引擎的主要开发者声称现在有了更多的时间进行游戏引擎开源版本的开发,而目前JMonkeyEngine的开发速度也确实大幅提升,2.0本版有可能在08年稍晚一些时候就会发布。此外,由Sun开发的project
wonderland不久前宣布将把其渲染引擎由Java3d转为JMonkeyEngine,使得JMonkeyEngine进一步受到广泛关注。
7. Project Dark Star
目前Project Dark
Star为0.95版,是Sun专门针对网络游戏的方面的应用所开发的。这个项目主要致力于解决大型游戏服务器的分布式应用问题,个人感觉类似于网络游戏应用中的j2ee。对于普通游戏的网络传输,Project
Dark Star也给出了自己的解决方案。但是不少人认为Dark Star
并不致力于简化普通游戏的网络应用,因为这个项目主要是对大型网络游戏服务器的分布式应用进行解决,从而促进Sun自己生产的服务器的销售。当然我并没有真正使用或研究过它,只是道听途说,很有可能有错误。
8. Project Wonderland
Sun开发的一个3d虚拟世界构建工具,Sun使用这个工程制造了一个虚拟工作环境MPK20,物理上处于不同大陆的人们在这个虚拟世界中可以在一间屋子里协同工作,这个项目的演示视频非常不错,建议去它的主页看一下。
未来
目前来看Java游戏并没有出现显著的上升趋势,除手机游戏外,Java游戏基本处于蛰伏状态。未来Java游戏可能迎来几个契机:
1. Java SE 6 Update N (之前被叫做 “Consumer JRE”)的发行
在这个新的版本中,Sun号称其将让Java升级更方便,部署更简单(方便的探测客户端的Java版本,并安装程序需要的版本),用户将能够只安装JRE中他们需要的部分,对于暂时用不到的部分可以等到用的时候再安装,同时加速Java虚拟机的启动速度(实际上就是在电脑刚开机的时候就启动Java虚拟机,而不是在第一次运行Java程序的时候),增加对swing的硬件加速支持。而新的Java
plug-in将大幅增强applet的稳定性,可靠性,将允许applet更改自己可以使用的内存大小,选择使用哪个特定版本的JRE执行。
实际上一旦Applet变得稳定,Java面对Flash将体现出巨大的性能优势,因此Java SE 6
Update N的发布将是Java游戏界未来一段时间内最大的契机。
2. Java FX的发布
Java FX的目标是让Java
FX像Flash一样易于开发,如果这个项目真的能成功的话,对于Java游戏的影响将非常巨大(不过由于缺乏Flash所拥有的方便的开发工具,我对Java
FX成功的可能性深表怀疑)
3. Sony或是任天堂决定在家用游戏机上支持Java
这个的希望非常渺茫的,但是考虑到微软的XNA做到了跨windows和Xbox360平台,也许Sony在PS3屡遭败仗的情况下会考虑一下支持Java。实际上现在的家用游戏机就是电脑,很多发烧友已经可以在PS3和WII上运行Java程序了,只是目前Java无法使用这些机器的硬件加速功能。
4. 手机进一步发展
目前看来移动设备的功能已经越来越强大,手机的性能也许在不久的将来可以达到电脑的水准,手机游戏也将占据游戏市场越来越大的份额,那么由于手机的操作系统种类繁多,跨平台的Java自然也会越来越受青睐。