J a v a程序设计项目1.项目背景为了提高学生动手能力,增加学生实践的机会,某软件公司实习单位要求学生5-6人组成开发团队进行Java程序项目开发,参考自己团队的实力与客户的要求,使用Java语言开发某一项目,此项目可以是应用程序,也可以是游戏开发等,项目名称自拟。
2.硬件资源和软件资源(1)每组配备联网PC台,智能手机一部(带有手机数据线)HP打印机一台。
(2)eclipse-SDK-3.6.1-win32软件开发程序(含有eclipseme插件)、SUNWTK 无线开发包或Symbian_3_SDK_v0_9等手机开发包。
3.实验室功能需求(1)实现学生机和教师机器(服务器)进行通信,相互共享资源。
(2)教师机器(服务器)上安装一台打印机,实现学生机可以共享打印。
(3)实现教师机器(服务器)连接和访问Internet。
(4)实现每一台学生机器访问Internet。
(5)要求为每一项目组学生机和教师机器分配一个标识,即学生机器的机器名为ST1~ST10,教师机器名为Server。
4.项目实施要求(1)要求各项目小组拿出详细的某某Java程序设计项目报告书(具体项目规划书格式参考附表一),关键步骤要有相应的截图。
(2)要求项目组长向各小组讲解与演示自己小组的项目成果,组长小组成员要熟练的解释与分析自己负责编写的Java代码或项目分工成果。
(3)最后提交用小组命名的文件夹,其中包括开发所用的所有资料与项目成果。
附表一:雷霆战机项目报告书一、项目概述本项目为一个Java游戏,是一个基于J2ME平台的飞机射击类游戏。
二、项目开发团队三、所用Java相关知识点用了java的MIDP2.0的游戏类、GameCanvas类、游戏中的多线程应用、游戏引擎框架结构等等。
四、项目需求分析1.游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。
一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。
因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。
2.游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。
3.玩家飞机的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定的智能性;敌人飞机的运行算法也要进行相关的设置,已免游戏过于简单。
4.对于双方发射的子弹应该赋予不同的速度,同时,程序应该设定敌人飞机的子弹不与敌人的飞机进行碰撞检测,已增加游戏的可玩性。
5.双方的飞机在前进时也需要考虑到是否碰撞到对方飞机,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。
每一次刷新页面、每前进一步都需要进行相关的碰撞检测。
6.为了增加界面的美观,在程序中添加了白云。
由于手机屏幕大小有限,所以白云的数量和出现的位置要经过相关的设置,才能实现白云不规则出现的效果。
7.游戏的地图不可能通过绘图来解决。
否则,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去手机上程序的原则和Java的优势。
8.Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。
除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。
9.游戏的结束、开始、动态信息画面作为构成一个程序都是必不可少的重要部分。
良好的用户界面更是吸引用户的硬指标,相关的美术构图和人性化设置也需要有一定的考虑。
五、类设计(包含结构图)5.1游戏进入前的选择每个MIDlet程序都必须有一个主类,该类必须继承自MIDlet。
它控制着整个程序的运行,并且可以通过相应函数从程序描述文件中获取相关的信息。
该类中拥有可以管理程序的创建、开始、暂停(手机中很可能有正在运行程序却突然来电的情况,这时应进入暂停状态。
)、结束的函数。
本程序主类为lzhhdm,并实现接口CommandLIstener。
图5-1游戏背景介绍首先显示的是游戏的背景介绍(图5-1),为此,在类lzhhdm定义Form类对象a,在startApp()函数中判断isSplash是否为真,如果为真的话,将创建Form类的实例a,并且调用append()方法在表单上放置StringItem类的实例以显示游戏背景信息。
使用语句ok=newCommand("ok",Command.OK,1);实例化Command类对象ok。
调用addCommand()命令建立ok命令与Form之间的关联,调用setCommandListener()命令使Form与CommandListener建立关联。
调用Displayable的seturrent()函数显示背景介绍窗口。
当玩家点击ok后将调用display.setCurrent(menuscreen)以显示游戏菜单menuscreen(图5-2)。
图5-2游戏的菜单类menuscreen继承自Canvas类,并实现接口Runnable和CommandListener。
在类menuscreen中定义了lowColor和highColor、highBGColor三个整型变量及布尔型变量co。
其中lowColor赋值为0x000000FF,代表兰色,higColor赋值为0x00FF0000,代表红色,highBGColor赋值为0x00CCCCCC,代表兰灰色,即背景条。
当玩家按住上或下键时,在函数keyPressed(intcode)中的整型变量menuIndex相应的减1或加1,相应的,在paint()函数中会根据menuIndex绘制选项是否被选中。
在函数run()中,如果co为真,则不停的repaint(),设置co的意义在于,当进入游戏主画面后,co赋值为false,以终止绘制选项的repaint(),提高游戏速度。
当移动选项条到某项,并点击ok时,在commandAction()方法中根据menuIndex的值判断选择了哪个选项,列如当选择“关于”时,将调用lzhhdm类中的renwuShow()方法以显示”关于”界面(图5-3),在renwuShow()方法中,Form类对象a=null,表示清空Form,并重新调用用append()方法在表单上放置StringItem类的实例以显示游戏关于信息,“帮助“界面的显示与”关于“界面相同,只不过调用的是helpShow()方法。
图5-3关于界面5.2mybullets类在介绍游戏主类gameScreen类之前,应该先简要说明一下玩家子弹类mybullets类,实际上,mybullets类是应该删除的,其要实现的功能应该放在gameScreen类中,但是由于设计游戏的过程也是一个学习的过程,而在当时,我并没有意识到这一点。
Mybullets类继承自Sprite类,以实现玩家子弹的相关功能。
首先,创建子弹状态数组privateint[][]bullets,其中,[i][0]代表子弹的X坐标,[i][1]代表子弹的Y坐标,[i][2]代表子弹Y方向速度,[i][3]代表子弹存活状态(由于此类是在早期设计的,而之后子弹存活状态使用了子弹射程作为标志位,所以其并没有起到作用)。
类中定义的方法setfirstposition()起到定义玩家子弹发射坐标的作用(此方法在设计时起到的作用是消除每按一次开火玩家子弹位置就重新定位这个BUG,但是,这个BUG完全可以用设置标志位的方法消除)。
方法newposition()实现的功能为更新玩家的子弹位置,并且检测玩家子弹与普通敌人的碰撞及记录玩家战果(更新子弹位置的功能可以由使用move()加设置标志位的方法取代;由于设计这个类的时候并没有考虑到添加BOSS等,所以在此检测碰撞,但添加BOOS等功能后,此处的检测完全可以和飞机对飞机等的碰撞检测封装在同一个方法中)。
mybullets类在gameScreen中建立了对象数组huokebullet[9],代表玩家所能发射的9发子弹。
5.3游戏逻辑及gameScreen 类是游戏的主类,决定着敌人何时出现,控制着敌人出现的方法,判断敌人及玩家是否被击中等。
它运行在独立的线程中,以恒定的频率刷新画面。
本程序设置为1/20秒。
其主逻辑如图4-4所示。
5.3.1gameScreen 类所实现的功能gameScreen 类要实现地图的滚动、敌人飞机的相关属性、玩家的相关属性等功能。
gameScreen 类包括了LayerManager ,这样所有静态和动态的图象都不需要手动刷新,只需要在LayerManager 中加入所有的需要控制的精灵,在统一由LayerManager 刷新即可,因此,在gameScreen 中创建LayerManager 的对象lm ,并在构造函数中实例子化。
其他精灵类的对象如敌人飞机、玩家飞机、玩家飞机的子弹、敌人的子弹、BOSS 及BOSS 所属的子弹都需在gameScreen()类中建立相应的对象,并在构造喊数中实例化,且由lm.appned()方法添加到LayerManager 类对象lm 中。
4.3.2地图的创建由于手机存储空间的限制,不可能将整张地图完整地存储在手机中,为了节约空间,往往提出地图中相同的图片组成一张PNG 格式的图片,然后象拼图一样拼出地图来,专业的游戏设计者往往自己写一个地图编辑器,以使拼图过程不是那么痛苦。
图5-4gameScreen 类主要关系流程图创建地图就需要使用TiledLayer。
TiledLayer指的是由一块一块类似用瓷砖拼凑起来的画面。
地图实际即为TiledLayer的一个对象。
先利用TiledLayer 的构造函数建立TiledLayer,根据构造函数的参数可以给定Cell数组的大小,并且地图图片切割成等尺寸的画面,并调用setCell()地图图片如图5-5所示。
因此,创建一个返回TtiledLayer的方法createBackGround(),以便在gameScreen()的构造函数中调用。
在方法中,定义整型数组map1[]以存储Cell 的索引值。
并使用tiledLayer.setCell(column,row,map1[i])设定TtiledLayer 的内容,以形成地图。
其中i的值由循环for(inti=0;i<map1.length;i++)取得,column由语句column=i%15取得、行由row=(i-column)/15取得。