J2me课程设计飞机游戏程序开发.docx
- 文档编号:29112689
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:18
- 大小:163.27KB
J2me课程设计飞机游戏程序开发.docx
《J2me课程设计飞机游戏程序开发.docx》由会员分享,可在线阅读,更多相关《J2me课程设计飞机游戏程序开发.docx(18页珍藏版)》请在冰豆网上搜索。
J2me课程设计飞机游戏程序开发
XXXX
信息科学与工程学院
课程设计任务书
题目:
飞机游戏程序开发
学号:
201012220212
姓名:
XXX
专业:
计算机应用技术
课程:
J2ME手机应用开发
指导教师:
XXX职称:
讲师
课程设计任务书及成绩评定
课程设计的任务和具体要求
任务:
1、利用本学期所学的知识,设计并开发出一个手机游戏或手机应用小系统。
手机游戏类例如:
贪吃蛇、扫雷游戏、五子棋游戏等;应用小系统类,例如:
手机短信的收发、通讯录系统等。
2、要求界面美观、功能较齐全;
设计要求:
1、开始显示初始化游戏界面,请稍后正在加载。
2、进入游戏列表,请选择你要玩的游戏,选择好进入游戏。
3、开始玩游戏,进行小游戏运行。
指导教师签字:
日期:
指导教师评语
成绩:
指导教师签字:
日期:
课程设计所需软件、硬件等
Ø硬件环境:
计算机、打印机、Inter(R)Core(TM)2DuoCPU,主频2.31GHz;内存3G;硬盘320G以上;1024×768显示分辨率
软件环境:
KVMEclipse、WTK2.5.2JavaME
课程设计进度计划
起至日期
工作内容
备注
2012.5.10—2010.5.30
2010.5.30—2010.6.15
2010.6.15—2010.6.24
熟悉相关知识,查阅资料
分析实验要求,确定解决方案
详细分析,编写代码及调试运行
书写实验报告
参考文献、资料索引
序号
文献、资料名称
编著者
出版单位
[1]JoshuaBloce著.潘爱民译.EffectiveJava中文版.2004年7月第4版.机械工业出版社.
[2]BruceEckel.侯捷译.Java编程思想.2005年3月第1版.机械工业出版社出版社
[3]王森著.Java手机/PDA程序设计入门.2005年2月第3版.电子工业出版社.
[4]JamesKeogh著.潘颖王磊译.J2ME开发大全.2004年2月第1版清华大学出版社.
[5]IanSommerville著.程成等译.软件工程.2003年1月第1版.机械工业出版社.
摘要
这款游戏的名字叫《览桥风光》。
J2ME(Java2MicroEdition)是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。
它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案,并因其“WriteOnce,runanywhere”的Java特性而提高开发的效率。
随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。
本论文着眼于J2ME技术的应用,开发一款可商用的手机游戏程序。
本程序将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。
本论文介绍了J2ME的相关技术及本程序的结构分析和具体功能的实现。
关键字:
J2ME;手机游戏;Java
目录
1本游戏背景介绍3
2开发环境的介绍4
3程序结构、思想和相关技术6
3.1本程序需要解决的主要技术问题6
3.2程序流程7
3.3子弹的运行和控制11
4程序分析和具体实现13
4.1游戏进入前的选择13
4.3地图的移动16
4.4地图的移动16
4.4玩家4次游戏机会的实现方法19
4.5游戏中的奖励及相关飞机的行为21
5总结29
附录一代码31
附录二操作说明31
1.本游戏背景介绍
在抗战中,由国民政府领导的中国空军是所有国民党军队中抗战最为彻底,也最为英勇的部队,虽然开战之初力量悬殊,但是面对穷凶极恶的日本侵略者,他们毫不畏惧,视死如归,全力以赴投身到民族救亡的伟业中去,用自己的鲜血和生命谱写了中华民族最为豪迈的诗篇。
自一九三二年二月五日“一·二八”事件始,至一九四五年八月十四日止,抗战期间,共出动飞机一千一百二十八批,八千八百四十七架次,击落敌机五百二十九架,击伤敌机一百一十架,炸毁敌机二百二十七架。
同时,中国空军空战中一共牺牲空勤人员六百六十一名。
我至今仍然清楚的记得,在抗日战争即世界反法西斯战争胜利50周年的时候,我在一本描述抗战空军的书里第一次看到阎海文烈士那年青的面孔时所带来的震撼,第一次看到高志航、沈崇海等空军烈士的事迹时所带来的感动,第一次听说碧山空战时的无奈。
时至今日,已经很少有人能够记得在中国的天空献身的抗日英雄们,我只能引用下面这句话来表达我的心情:
“你们的名字无人知晓,你们的业绩与世长存!
”
我的这款游戏取名为《览桥风光》,以纪念从览桥中央航校走出的英雄们。
2.开发环境及相关技术的介绍
操作系统:
MicrosoftWindowsXP
程序语言:
Java2
开发包:
Java(TM)2StandardEdition(5.0)
SunMicro.J2MEWirelessToolKit2.2
IDE:
Eclipse3.01
3程序结构、思想和相关技术
3.1本程序需要解决的主要技术问题
1.游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。
一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。
因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。
2.游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。
3.玩家飞机的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定的智能性;敌人飞机的运行算法也要进行相关的设置,已免游戏过于简单。
4.对于双方发射的子弹应该赋予不同的速度,同时,程序应该设定敌人飞机的子弹不与敌人的飞机进行碰撞检测,已增加游戏的可玩性。
5.双方的飞机在前进时也需要考虑到是否碰撞到对方飞机,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。
每一次刷新页面、每前进一步都需要进行相关的碰撞检测。
6.为了增加界面的美观,在程序中添加了白云。
由于手机屏幕大小有限,所以白云的数量和出现的位置要经过相关的设置,才能实现白云不规则出现的效果。
7.游戏的地图不可能通过绘图来解决。
否则,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去手机上程序的原则和Java的优势。
8.Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。
除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。
9.游戏的结束、开始、动态信息画面作为构成一个程序都是必不可少的重要部分。
良好的用户界面更是吸引用户的硬指标,相关的美术构图和人性化设置也需要有一定的考虑。
以上相关技术细节和整体流程将分别在以下小节阐述。
3.2程序流程
MIDletsuite是MIDP应用程序的最小单位,JAM负责将手机内的MIDletsuite以图形化的方式呈现,让用户能够选取欲执行的MIDletsuite,一旦选取了某个MIDletsuite,操作系统就会激活KVM执行里面的MIDlet。
MIDlet及相关的支持类组成了MIDP应用程序的实际内容。
而
每个MIDlet都必须继承javax.microedition.midlet.MIDlet这个抽象类。
在MIDP规范中定义了MIDlet的生命周期,以及可以存在的三种状态,包括Paused、Active以及Destroyed,每一个MIDlet在任何时刻只可能处于其中的一个状态。
这三种状态的转换关系如图3-1所示:
MIDlet有三个状态,分别是pause、active和destroyed。
在启动一个MIDlet的时
候,应用管理软件会首先创建一个MIDlet实例并使得他处于pause状态,当startApp()方法被调用的时候MIDlet进入active状态,也就是所说的运行状态。
在active状态调用destroyApp(booleanunconditional)或者pauseApp()方法可以使得MIDlet进入destroyed或者pause状态。
值得一提的是destroyApp(booleanunconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS通知MIDlet进入destroyed状态。
在destroyed状态的MIDlet必须释放了所有的资源,并且保存了数据。
如果unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态。
本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。
运行程序后允许用户选择执行选项菜单,在开始游戏后将先从外部文件载入地图文件,对背景的所有物体进行绘图。
在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。
游戏开始后先绘制地图,并将各个对象实例化。
在主程序运行的线程中,游戏中所有的对象都应该运行在同一个线程下。
当敌人或者用户的子弹达到射程范围后,并不删除子弹对象,而是使用setVisable(false)使其不能显示,当用户或敌人在次发射子弹时,只需使用setVisable(true)设置成可以显示即可。
在屏幕重绘的主程序中,将在每次的循环中判断若干事件,以便程序进入相关的分支执行相关的反应代码。
如:
玩家剩余飞机数是为0、敌人、玩家飞机是否被击中、屏幕上相关信息的绘制等。
程序为需要完成独立功能的模块设置了单独的类。
lzhhdm类继承自Midlet,gameScrenn类、MenuScreen类继承自GameCanvas,mybullets继承自Sprite类。
载入程序后首先启动的是程序介绍的信息画面。
点击ok后调用MenuScreen类实现菜单。
如果选择进入游戏,则调用gameScreen类,并且中止MenuScreen类中的线程运行,已提高运行速度。
Mybullets类为玩家子弹类。
3.3子弹的运行和控制
玩家的子弹是个精灵数组,有9个元素,表示玩家一次最多可以发射3组9发子弹,对于一个完整的游戏来讲,应该根据关卡的不同而给予玩家不同的飞机,飞机性能的差别在于子弹的射程不同。
由于本游戏仅有一关,所以子弹速度设定的差别没有体现出来。
当玩家一次发射了3组子弹,而这3组子弹并没有消失时,玩家将无法发射子弹。
使用每组子弹的第一发作为与敌人进行碰撞检测的精灵,同时相关的标志位也设在第一发子弹中。
如果玩家子弹与敌机相撞,则敌机消失时,子弹精灵的图片替换为爆炸图片,直到第二次发射该组子弹时,才将图片替换为子弹图片。
4程序分析和具体实现
4.1游戏进入前的选择
每个MIDlet程序都必须有一个主类,该类必须继承自MIDlet。
它控制着整个程序的运行,并且可以通过相应函数从程序描述文件中获取相关的信息。
该类中拥有可以管理程序的创建、开始、暂停(手机中很可能有正在运行程序却突然来电的情况,这时应进入暂停状态。
)、结束的函数。
本程序主类为lzhhdm,并实现接口CommandLIstener。
首先显示的是游戏的背景介绍(图4-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的
图4-1游戏背景介绍
seturrent()函数显示背景介绍窗口。
当玩家点击ok后将调用display.setCurrent(menuscreen)
以显示游戏菜单menuscreen(图4-2)。
类menuscreen继承自Canvas类,并实现接口Runnable
和CommandListener。
在类menuscreen中定义了lowColor和
highColor、highBGColor三个整型变量及布尔型变量co。
其
中lowColor赋值为0x000000FF,代表兰色,higColor赋值为
0x00FF0000,代表红色,highBGColor赋值为0x00CCCCCC,代表
图4-2游戏的菜单
兰灰色,即背景条。
当玩家按住上或下键时,在函数keyPressed
(intcode)中的整型变量menuIndex相应的减1或加1,相应的,在paint()函数中会根据menuIndex绘制选项是否被选中。
在函数run()中,如果co为真,则不停的repaint(),设置co的意义在于,当进入游戏主画面后,co赋值为false,以终止绘制选项的repaint(),提高游戏速度。
当移动选项条到某项,并点击ok时,在commandAction()方法中根据menuIndex
的值判断选择了哪个选项,列如当选择“关于”时,将调用lzhhdm类中的renwuShow()方法以显示”关于”界面(图4-3),在renwuShow()方法中,Form类对象a=null,表示清空Form,并重新调用用append()方法在表单上放置StringItem类的实例以显示游戏关于信息,“帮助“界面的显示与”关于“界面相同,只不过调用的是helpShow()方法。
图4-3关于界面
4.2地图的创建
由于手机存储空间的限制,不可能将整张地图完整地存储在手机中,为了节约空间,往往提出地图中相同的图片组成一张PNG格式的图片,然后象拼图一样拼出地图来,专业的游戏设计者往往自己写一个地图编辑器,以使拼图过程不是那么痛苦。
创建地图就需要使用TiledLayer。
TiledLayer指的是由一块一块类似用瓷砖拼凑起来的画面。
地图实际即为TiledLayer的一个对象。
先利用TiledLayer的构造函数建立TiledLayer,根据构造函数的参数可以给定Cell数组的大小,并且地图图片切割成等尺寸的画面,并调用setCell()设置具体的图象格内容。
地图
图4-5地图
图片如图4-5所示。
因此,创建一个返回TtiledLayer的方法createBackGround(),以便在gameScreen()的构造函数中调用。
在方法中,定义整型数组map1[]以存储Cell的索引值。
并使用tiledLayer.setCell(column,row,map1[i])设定TtiledLayer的内容,以形成地图。
其中i的值由循环for(inti=0;i 画出地图后,由lm.append()将地图添加到LayerManager类对象lm中。 由于地图位于Layer的最低层,即离用户视线最远的层,所以Tiledlayer最后一个被添加到lm中。 4.2地图的移动 根据游戏的设定,游戏中地图是向下移动的,实现此功能的方法如下: 首先,在使用createBackGround()函数创建地图数组时,用(row+1)*16-getHeight() 语句对整型变量row2赋值,其中row+1代表地图有多少列,16为地图片的高度,而减去getHeight()是因为要留出一个屏幕的可视区域,由于J2ME规定坐标系中下方向为正,所以使用语句y1=-row2将row2的数值变为负数。 (0,y1) y1=y1+1; ViewWindow 向下移动 (0,0) 图4-6 图4-6 其次,render()函数中,使用lm.setViewWindow(0,0,getWidth(),getHeight()+10000)设定可视区域的范围,(0,0)表示ViewWindow的起始坐标,(getWidth(),getHeight()+10000) 使用lm.paint(g,0,y1)决定 ViewWindow从屏幕的哪里画起。 在run()函数中的while(conti)中, 屏幕 使用语句y1=y1+1使得每次绘图都使 地图下移1个象素。 (参考图4-6) 4.3玩家4次游戏机会的实现方法 根据游戏设置,玩家在每关中有共四次机会,当玩家飞机被击中或撞击爆炸后,程序首先检测整型变量playerno的值,并根据playerno的值决定屏幕右上角所画玩家飞机标志的数量(参考图4-8),playerno的初始值设为3,因为碰撞后才减1,所以玩家共有4次机会,当playerno<0时,游戏结束,同时将变量pver赋值为1,render()或renderboss()函数中,over=1代表在屏幕上GAMEOVER等相关信息,同时,将整型变量inputno赋植为1,以使手机的方向键失效,以消除玩家可以控制爆炸图像移动这个BUG。 同时整型变量pzbz赋植为1,以消除玩家爆炸图像继续与敌人进行碰撞检测这个BUG。 当playerno>0时,碰撞后,将变量planert赋值为1,在之后的if(planert==1)判断语句中,重新设定玩家飞机的图片和可视状态,同时使用setPosition()函数设定玩家非的位置在屏幕下方。 设定pzbz=1,即不检测碰撞,玩家有短暂时间无敌,无敌时间由屏幕右上角进度条表示。 设定inputno=1,即飞入屏幕的过程中手机键盘是不可以用的。 设置planert=2,即以上这些设置只执行一便。 在if(planert==2)判断语句中,使用语句move( 0,-2)使飞机自己向上运动,使用if(c1.getY()<( planepo-24))判断飞机是否到达屏幕最下方(planepo 是屏幕下边缘的坐标),如条件为真,则将inputno 设置为1,表示键盘可用,将planert赋值为3,使 其不再执行以上各步。 4.4游戏中的奖励及相关飞机的行为 根据游戏设定,当y1=-1000时,会出现如图4-8 所示的飞机(sboss),当玩家击落他后,屏幕会显示“ 援军到达“,并且玩家剩余飞机数加1。 使用if((y1==-1000)&&(sbz==0)){}设定sboss的 初始位置,根据游戏设定,sboos从屏幕上方倒飞入屏幕, 所以sboss设定的初始位置(50,planepoup-65),其中 planepoup为屏幕上边缘的标志位。 图4-9 最后,要将sbz赋值为1,消除sboos不停设置初始位置的BUG。 当sboss飞入屏幕后,将sbz赋值为2,以执行下面 的if(sbz==2)语句。 图4-10 在判断语句if(sbz==2)里,将根据玩家的位置自动飞 行。 首先,根据玩家飞机的位置对sbmove赋值,当c1在sboos的上、下、左、右时,其对应的值为1、2、3、4在这4个if语句中,要设置标志位(smovebz==0)。 设置这个 标志位的目的是防止sboos根据c1的位置不停的改变运行状态,即防止sboos成为跟踪飞机。 当sboos根据c1的位置改变一次运行方向后,smovebz赋值为1,即不检测c1 的位置。 只有sboss运行到屏幕的边缘时,才将smovebz重新赋值为0,使其可以再次通过c1的位置决定sboos的运行方向。 当玩家子弹击中sboss后,使用sboss.setFrame (1),此时飞机变红,在本次repaint结束前,使用sboss.setFrame(0)使飞机变为本来颜色,而程序设定每1/20秒画一次,由此得到飞机被击中后变色的效果。 (参见图4-10)。 sboos会根据玩家飞机的位置发射子弹,根据游戏设置,当玩家在其上方、左方、右方时,sboss一次发射1发子弹,而玩家飞机在其下方时,sboss一次发射3发子弹。 sboss与cboss共用3发子弹,因为当sboss出现时,离关尾还远,所以,为了提高效率,采用这种方法。 如果sboos被击落后,使用函数setVisable(false)将bossbullet0、bossbullet1、bossbullet2设置为不见,使用sboss.setImage()函数将sboos的图片设置为爆炸图片。 同时,玩家生命标志playerno加1,sbz赋值为-1,使得sboos无法发射子弹,sbpzbz赋值为1,使得玩家的子弹不与sboos进行碰撞检测。 同时在屏幕中使用drawString()绘制“援军到达”四个字,随着屏幕的运动,爆炸图片逐渐进入屏幕下方,当sboos.getY()>palnepo,通过改变标志位的值使得drawSteing()不在执行,四字消失。 如果玩家被击落后并没有点“返回“,而此时,背景会一直运动到关尾,考虑到其与关尾BOSS共用3发子弹,如sboos不消失,将会出现子弹乱飞的情况。 所以,如果判断语句if((sboss.getY()==getHeight()))为真,则表示离地图的终点只有一个屏幕的距离时,sbz赋值为-1、sbpzbz赋值为1(含义上面已经说明)。 同时调用sboss.move(0,-3),使sboos快速飞出屏幕,直到判断语句if(sboss.getY()<-65)为真时,调用下面的函数setVisable(false),使得sboos不可见。 5总结 本程序设计实现了手机上以J2ME为平台的飞行射击游戏的开发,敌人运行的方式由程序进行控制,具有一定的可玩性和复杂性。 经过了细心的调试和排错解决了绝大部分的问题。 但是我的水平实在有限,在第5章列举的众多BUG和遗憾就可以看出这一点来,但我相信,随着时间的推移,个人水平的增长,我一定会重写这个程序,使其更加完善, 参考文献 附录一代码 附录二操作说明 在电脑中使用模拟器的步骤如下: 1使用WTK的新建项目功能建立一个新项目,要求与Eclipse工作区下的项目名称MIDlet类名相同。 2新建项目后,将Eclipse工作区下的.java文件拷入src文件夹,将.class文件拷入class文件夹(需要新建),将pic文件夹拷入res文件夹,点击生成,如一切正常。 3选择项目-包-生成包。 4生成的jar和jad文件存储在lzhhdm/bin目录下。 5运行MotorolaSDKv4.2forJ2ME,使用MOTOA760手机模拟器进行测试。 点击Lanuc按纽,即可以进行游戏了。 电脑键盘的方向键上、下、左、右可以控
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- J2me 课程设计 飞机 游戏 程序 开发