基于J2ME的Java游戏坦克大战的开发毕业设计论文文档格式.docx
《基于J2ME的Java游戏坦克大战的开发毕业设计论文文档格式.docx》由会员分享,可在线阅读,更多相关《基于J2ME的Java游戏坦克大战的开发毕业设计论文文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
短短几年内,手机已经升级了几代产品,普及率逐年攀升,生产效率不断上升,产品价格比个人电脑的摩尔定律有更惊人的下调,以至手机是大多是城市居民不可缺少的一件随身设备。
继短信、彩信等服务之后,中国移动提供基于Java的百宝箱业务,应用产品遍及商务应用、信息获取、英汉互译、游戏娱乐等多媒体领域。
根据官方公布的统计数据,我国移动电话用户已突破3亿。
依托这样的市场,一旦无线Java应用大规模开展起来,将会创造出比短信业务更为惊人的利润。
Java语言原先的开发目的与市场的需求不谋而合,并且也已经成为手机应用程序开发的标准,国际大公司如Nokia、Motorola及Siemens等所设计的手机内都加入Java程序的支持,可见在不久的将来,Java将会成为移动设备上最热门的语言。
手机中将Java语言引入,作为一种通用的开发标准,并将向市场推广普及仅仅短短几年,J2ME仍是一种新型的技术,中文资料除台湾出版过相关书籍外,国内相关介绍资源很有限,国内J2ME开发商也屈指可数,名声较响的Digital-Red公司也仅成立于1999年。
本文可算是对新技术的一些尝试,代表对无线平台应用程序推广的一些努力。
本论文中:
第一章介绍游戏机软硬件历史、Java语言、J2ME及其相关技术;
第二章介绍了开发工具和相关软硬件环境的背景;
第三章分析该作品设计的思想和流程,介绍总体结构;
第四章并详细阐述有关重点实现细节;
第五章提及了开发过程、心得体会、经验和感想。
摘要-I-
Abstract-I-
第一章 绪论
1.1手机软件现状
在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。
但是传统手机存在以下弊端:
1.传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。
2.传统手机访问互联网是通过WAP(WirelessApplicationProtocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。
而Java技术在无线应用方面的优势非常明显:
1.应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大。
2.Java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(GUI);
3.Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。
基于以上分析,Java手机将是未来手机的发展方向,是业界的热点。
1.2游戏业务及J2ME概况
虽然Java已经被用到许多企业级软体上,可是其实骨子里面还是非常适合用在嵌入式系统之中。
Java平台演进到Java2后,Java平台分别针对不同领域的需求被分成四个版本,亦即J2EE、J2SE、J2ME以及JavaCard(其结构示意图见图1-1)。
其中J2ME定位在消费性电子产品的应用上。
这个版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的架构让不同类型产品能够随时增加支持的能力。
这个版本的应用层面相当广泛,会是未来Java平台发展的重点项目。
J2ME在设计其规格的时候,遵循着“对各种不同的装置而造出一个单一的开发系统是没有意义的事”这个基本原则。
于是J2ME先将所有的嵌入式装置大体上区分为两种:
一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA、手机);
另外一种则是运算能力相对较佳、在电力供应上相对比较充足的嵌入式装置(比方说冷气机、电冰箱、电视机上盒(set-topbox))。
因为这两种型态的嵌入式装置,所以Java引入了一个叫做Configuration的概念,把上述运算功能有限、电力有限的嵌入式装置定义在ConnectedLimitedDeviceConfiguration(CLDC)规格之中;
而另外一种装置则规范为ConnectedDeviceConfiguration(CDC)规格。
也就是说,J2ME先把所有的嵌入式装置利用Configuration的概念区隔成两种抽象的型态。
J2ME平台被认为是最杰出的手机游戏平台,它为开发者、设备制造商、网络通信公司和消费者广泛接受。
它有一些非常重要的特征对所有组织都有益。
因为J2ME应用在不同设备上都是便携式的,他们常常可在网络上下载和执行。
如果没有正确的防范,它则为用户和无线通信公司冒着无数个安全的风险。
幸运的是,Java被设计成一种安全的语言。
所有字节码应用在执行之前都要校验;
JVM在执行过程中监督应用的安全性和存储违反问题。
MIDPv2运行时间包括一个完全特征化的、基于域的安全管理员,它在应用的数字签名者鉴别的基础上赋予应用API级许可。
纵观IT产业的历史,就像军事的发展时常推动计算机的演化一样,计算机游戏已经成为技术创新背后的动力之一。
计算机游戏者渴望更加强大的硬件计算能力;
渴望不受不同的软件的限制——无论是将图形强制在人工智能(AI)上还是网络安全性。
游戏开发者和玩家常常是前沿计算机技术的最早的采用者。
由于他们的创新天性,游戏不再是由大型采购公司控制的技术产品——游戏领域总是有充足的空间给那些在这方面有天分的单个创新者。
手机游戏的盈利主要是由于它们的涉及面很广。
手机已经与现代生活方式紧紧地结合在一起。
他们是最普遍携带的个人用品中仅次于钥匙和钱包的东西。
传统的台式机游戏将目标锁定在低级趣味的人和青少年身上,而手机游戏则每个人都可以访问的到——随时,随地。
尽管每个手机游戏都不贵,但是巨大的使用量(如:
每人每星期一个新游戏)将使得这个市场商机无限。
但是,对于开发者来说,将控制台游戏迁移到手机游戏工程很大。
因为他们所面向的对象、生活方式和分布式模型都有着极大的区别。
一个成功的手机游戏大多具有以下特征:
·
易于学习:
既然手机游戏面向的是普通消费者而不是计算机专家,那么他们不可能深入的学习游戏技巧。
消费者不会花几个小时去研究一个3元的手动操作的游戏。
保持游戏的简单是最基本的要求。
可中断性:
多任务处理是手机生活方式的基本特征。
手机用户常常在任务(如等一个电子邮件或者等车)之间有一小段时间。
而游戏、日历管理、通讯和工作数据访问使用的是同一个设备。
所以一个好的手机游戏应该提供短时间的娱乐功能,并且允许用户在游戏和工作模式之间顺利切换。
基于订阅:
手机游戏的盈利成功取决于他们巨大的使用量。
一开始开发和设计每个游戏都是昂贵的。
如果一个手机游戏开发者要赢利的话,重要的是:
同一个游戏引擎,多个标题,基本的故事情节类似。
基于订阅的游戏是不断产生收入的最好方法。
丰富的社会交互:
不管一个游戏设计得多好,只要玩家找到了它的根本模式或者玩完了所有的游戏路径很快就会厌烦这个游戏。
对于一个基于订阅的游戏,重要的是与别的玩家合作以增强所玩游戏的智力和随机性。
在今天纷繁复杂的多玩家游戏中具有丰富社会交互的游戏证明是成功的。
利用手机技术的优点:
巨额的手机技术研发费用都花在提高设备和网络的可用性和可靠性上面。
因此,手机设备硬件和网络协议与桌面/控制台世界(如全球定位系统(GPS)扩展、条形码扫描仪、和短消息服务(SMS)/多媒体信息服务(MMS)通讯)有着非常大的差别。
好的手机游戏应该利用那些更新的设备特征和网络基础设备的优点。
无违法内容:
既然所有年龄/性别的人群都玩手机游戏并且常常在公共/工作场合,就应该避免明显的暴力或者色情内容。
1.3任天堂(Nintendo)的8位FC机器和BattleCity背景介绍
FC(FamilyComputer)主机在欧美又称NintendoEntertainmentSystem(可译作任天堂娱乐平台即NES)。
FC主机在游戏业界造成的巨大冲击众所周知,这款主机在当时事实上几乎占领了世界各地多个国家的整个游戏市场,并使得逐渐
没落的北美游戏市场再度复苏。
这款主机的性能比当时的多数主机都要强大,而价格上却便宜得多。
主机所采用得处理器为CMOS6502,一款已经淘汰的70年代中期产品。
由于其价格便宜且极易使用,经过任天堂的改造后又焕发了全新活力。
6502芯片cpu主频为8bit,12MHz,内存8k,画面52色,同屏最多显示其中的13色,声音2个矩波,1个三角波,1个杂音,1个PCM音频(见图1-2)。
BattleCity是其发售卡带中的一款力作,设置了35个关卡,可以双人操纵,画面设置了若干种类的建筑物和阻挡物,以消灭所有敌人为通关条件,并有接宝物等增加游戏效果的设置,画面精美,音效杰出,在PC机的80386处理器仍未面世的当时,能在硬件上运行这样的2D程序不得不令人惊叹,难怪常有人说游戏程序是最大限度发挥硬件水平的载体。
其游戏界面如图1-3所示。
1.4本章小结:
引言和第一章中介绍了手机在无线应用方向的当今概况,并介绍了游戏业务在当前社会的发展潜力。
分析了J2ME在手机软件开发中起的重要作用,描述了本论文的相关背景。
第二章开发环境及相关技术的介绍
2.1开发环境
操作系统:
MicrosoftWindowsXP
程序语言:
Java2
开发包:
Java(TM)2StandardEdition(build1.4.1_02-b06)SunMicro.J2MEWirelessToolKit2.1
IDE:
BorlandJbuilder9
2.2Java语言的特点
1.平台无关性
Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。
使用Java编写的程序能在世界范围内共享。
Java的数据类型与机器无关。
2.安全性
Java的编程类似C++,但舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针入侵系统。
它提供了安全管理器,防止程序的非法访问。
3.面向对象
Java吸收了C++面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。
4.分布式
Java建立在TCP/IP网络平台上,提供了用HTTP和FTP协议传送和接收信息的库函数,使用其相关技术可以十分方便的构建分布式应用系统。
5.健壮性
Java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。
Java取消了C语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。
2.3关于JBuilder9
JBuilder是目前最好的Java开发工具之一,在协同管理、对J2EE和XML的支持等方面均走在其他产品的前面。
JBuilder是遵循Sun公司J2EE标准的可视化集成开发工具。
Jbuilder是一种处于市场领先地位的跨平台环境,主要用于构建具有行业实力的企业Java应用程序。
JBuilder集成了Borland公司开发工具系列的优秀特性,使得使用过C++Builder,Delphi的程序员很容易的过度到JBuilder的开发环境当中。
由于Java技术的发展迅速,经常有新的组件推出或新的错误修正,致使JBuilder的版本升级很快。
当两年前还是JBuilder6时,现今已推出了9、10的版本。
2.4关于WirelessToolKit
WTK(WirelessToolKit)是Sun公司针对J2ME推出的用于手机和Palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。
它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用厂商具有一定的不兼容性。
虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他IDE需集成采用的必备元素。
2.5JavaAppicationManager
手机中负责调配程序运行资源的管理后台是JavaApplicationManager。
它所使用的传输媒体可以是红外线、网络、以及其他可用来传输的媒体。
JavaApplicationManager会从网络上下载代表该ApplicationSuite的JAR档,接着在手机上安裝此MIDletSuite,然后在手机开始执行该应用程序。
整个详细的运作流程如图2-1所示。
2.6本章小结:
第二章介绍了Java语言的特点、本程序的开发环境及其相关工具的原理和使用。
第三章程序结构、思想和相关技术
3.1本程序需解决的有关技术问题
1.游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。
一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。
因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。
2.游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。
3.己方坦克的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定其一定的智能性;
同时,出现在屏幕上的敌方可能会有较多的数量,这需要为每个敌方开辟一个线程以便能让其独立运行。
Java的多线程能力为实现这样的游戏提供了可能。
敌人坦克的运行算法也需要进行适当的设置,以免游戏过于简单,单调。
4.对于双方坦克发出的子弹的控制也需要对其跟踪控制,子弹也需要处在独立的线程中。
敌方子弹仅需要扫描用户坦克,而用户坦克需要在每一步扫描所有的敌方坦克。
这需要对所有的对象有较好的控制。
另外,子弹在运行过程中也需要实时扫描是否碰撞到了相关障碍物或屏幕边界。
如此过多的线程同时在本来效率就不高的KVM虚拟机上运行,也许会导致程序的缓慢。
5.双方的坦克在前进时也需要考虑到是否碰撞到相关物体或对方坦克,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。
每一次刷新页面、每前进一步都需要将所有的周围环境都进行扫描。
6.游戏的结束、开始、动态信息画面作为构成一个完美程序都是必不可少的重要部分。
良好的用户界面更是吸引用户的硬指标,相关的美术构图也需要有一定的考虑。
7.游戏的地图不可能通过绘图来解决。
否则,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去手机上程序的原则和Java的优势。
同时,地图关卡不宜保存在手机有限的内存中,而最好采取外部文件的读入读出方法。
8.用户运行游戏时需要有分数记录的可能。
如何采用合理的记分标准,需要进行适当的设计。
记录分数的存储方式也需要有较好的解决方案。
手机中由于处理器和内存空间、存储空间都十分有限,其数据库系统与普通PC大相径庭。
其数据库结构较为简单,被称之为RMS系统。
9.Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。
除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。
以上相关技术细节和整体流程将分别在以下小节阐述。
3.2程序流程
MIDletsuite是MIDP应用程序的最小单位,JAM负责将手机内的MIDletsuite以图形化的方式呈现,让用户能够选取欲执行的MIDletsuite,一旦选取了某个MIDletsuite,操作系统就会激活KVM执行里面的MIDlet。
MIDlet及相关的支持类组成了MIDP应用程序的实际内容。
每个MIDlet都必须继承javax.microedition.midlet.MIDlet这个抽象类。
在MIDP规格中定义了MIDlet的生命周期,以及可以存在的三种状态,包括Paused、Active以及Destroyed,每一个MIDlet在任何时刻只可能处于其中的一个状态。
这三种状态的转换关系如图所示:
本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。
运行程序后允许用户选择执行选项菜单,在开始游戏后将先从外部文件载入地图文件,对背景的所有物体进行绘图。
在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。
用户控制的坦克运行在主线程中,随屏幕刷新的频率而步进。
敌方坦克将在游戏开始时逐渐新增线程,每增加一个敌方对象就新增加一条线程,一旦线程数满到最大值(本程序暂设置为6),就不允许敌人再继续出现。
用户坦克自诞生之时起将拥有一发子弹,子弹虽然开在单独的线程中,但运行结束后(比如撞到相关物体或敌方坦克时)并不结束子弹对象,只是将其线程终止。
用户再次发射子弹时只是将终止的线程再次激活。
在屏幕重绘的主程序中,将在每次的循环中判断若干事件。
如:
用户坦克的生命是否已完全用尽,敌方坦克数是否已经为零,屏幕上的坦克数量是否少于仍剩下的坦克数量等。
以便程序进入相关的分支执行相关的反应代码,结束游戏或统计分数等。
主程序流程如图3-2所示:
程序为需要完成独立功能的需显示的模块设置了单独的类。
TankMain类是继承自MIDlet的控制主程序启动的首先被载入系统的部分。
载入程序后首先启动的是程序介绍的信息画面。
闪过后载入StartChoice类,为用户提供可选择的选项。
在选择开始后,将运行BattleCanvas类中的总流程控制。
它决定了游戏何时该结束,何时分配敌人数量,GameOver字样的闪现规则,地图的绘制及整个游戏的调度。
图3-3是程序中类之间的UML分析图。
敌方坦克与用户坦克的相关功能和具体行为分别定义在EnemySprite和UserSprite类中,它们都继承自TankSprite公共类,以简化程序的代码、理清结构。
在每关的结束或死亡后都将载入ScoreScreen类,统计当前的分数。
如果已死亡或完成所有的关数,程序将用户所得的分数记载到RMS数据库中,进行永久性保存。
载入过程中将对所得分数与以往历史比较,放置到合适的位置中,形成排序。
3.3绘图与MIDP2.0新增的GameCanvas包
3.3.1提供低级绘制的Canvas类
为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类,尤其在游戏程序中,几乎完全依赖的就是Canvas抽象类进行绘图。
从程序开发的观点看,Canvas类可与高级Screen类交互,程序可在需要时在Canvas中掺入高级类的组件。
Canvas提供了键盘事件、指点杆事件(如果设备支持),并定义了允许将键盘按键映射为游戏控制键的函数。
键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并不是每个设备的键盘布局都适合游戏的操作。
应当将键代码转换为游戏键的代码,以便硬件开发商能定义他们自己的游戏键布局。
本程序中,操纵用户坦克运行的按键都定义为游戏控制键,这样便能适应所有的机器。
3.3.2Graphics类
Graphics类提供了简单的2D绘图功能。
它具有24位深度色彩的绘制能力,以三原色分别各占一个字节表示其颜色。
程序只能在paint()函数中使用Graphics绘制,GameCanvas可调用getGraphics()函数直接绘制在缓冲区上,可以在任何时间请求传输到前台。
其对象会被传给Canvas的paint()函数,以便最终显示。
3.3.3PNG格式
PNG(