有起到作用)。类中定义的方法setfirstposition()起到定义玩家子弹发射坐标的作用(此方法在设计时起到的作用是消除每按一次开火玩家子弹位置就重新定位这个BUG,但是,这个BUG完全可以用设置标志位的方法消除)。方法newposition()实现的功能为更新玩家的子弹位置,并且检测玩家子弹与普通敌人的碰撞及记录玩家战果(更新子弹位置的功能可以由使用move()加设置标志位的方法取代;由于设计这个类的时候并没有考虑到添加BOSS等,所以在此检测碰撞,但添加BOOS等功能后,此处的检测完全可以和飞机对飞机等的碰撞检测封装在同一个方法中)。
mybullets类在gameScreen中建立了对象数组huokebullet[9],代表玩家所能发射的9发子弹。
4.3游戏逻辑及gameScreen类
gameScreen类是游戏的主类,决定着敌人何时出现,控制着敌人出现的方法,判断敌人及玩家是否被击中等。它运行在独立的线程中,以恒定的频率刷新画面。本程序设置为1/20秒。其主逻辑如图4-4所示。
4.3.1gameScreen类所实现的功能
gameScreen类要实现地图的滚动、敌人飞机的相关属性、玩家的相关属性等功能。
gameScreen类包括了LayerManager,这样所有静态和动态的图象都不需要手动刷新,只需要在LayerManager中加入所有的需要控制的精灵,在统一由LayerManager刷新即可,因此,在gameScreen中创建LayerManager的对象lm,并在构造函数中实例子化。
其他精灵类的对象如敌人飞机、玩家飞机、玩家飞机的子弹、敌人的子弹、BOSS及BOSS所属的子弹都需在gameScreen()类中建立相应的对象,并在构造喊数中实例化,且由lm.appned()方法添加到LayerManager类对象lm中。
4.3.2地图的创建
由于手机存储空间的限制,不可能将整张地图完整地存储在手机中,为了节约空间,往往提出地图中相同的图片组成一张PNG格式的图片,然后象拼图一样拼出地图来,专业的游戏设计者往往自己写一个地图编辑器,以使拼图过程不是那么痛苦。
创建地图就需要使用TiledLayer。TiledLayer指的是由一块一块类似用瓷砖拼凑起来的画面。地图实际即为TiledLayer的一个对象。先利用TiledLayer的构造函数建立TiledLayer,根据构造函数的参数可以给定Cell数组的大小,并且地图图片切割成等尺寸的画面,并调用setCell()设置具体的图象格内容。地图
图片如图4-5所示。
因此,创建一个返回TtiledLayer的方法createBackGround(),以便在gameScreen()的构造函数中调用。在方法中,定义整型数组map1[]以存储Cell的索引值。并使用tiledLayer.setCell(column,row,map1[i])设定TtiledLayer的内容,以形成地图。其中i的值由循环for(inti=0;i
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.3.8input()
input()函数的作用是检测用户的输入。
首先使用if(inputno==0)判断用户的输入是否
被禁止,如为真,则用户输入不被禁止。
其次,调用getKeyStates()查询按键的状态。
当玩家按方向键时,玩家飞机就向不同的方向运行,这需要使用c1.move(intx,inty)函数,当玩家控制飞机向左或右飞时,需要使c1.setFrame()函数改变飞机的图形(参见图4-7,此时飞机右飞)。同时,还需要判断飞机是否飞出屏幕,如,当飞机右飞时,用if(c1.getX()>(getWidth()-c1.getWidth()))
语句判断(getWith()为屏幕的宽度,c1.getWidth()为玩家飞机c1的宽度),如果条件为真,则使用c1.setPosition((getWidth()-c1.getWidth()),c1.getY())语句将飞机设置在紧靠屏幕右边的位置。上、下、左的设置原理同上。
语句if((keystate&LEFT_PRESSED)==0)的作用是消除左、右飞后在上、下飞时飞机的形态不变的BUG。如果为真,则执行语句c1.setFrame(0),表示只要左键松开飞机的形态都是平飞。
根据游戏设定,玩家一次最多只能发三组子弹,并且子弹有射程限制(在类mybullets中使用整型变量no表示),而当玩家按下"开火"键时,即if((keystate&FIRE_PRESSED)!=0)中判断条件为真时,首先执行循环语句for(inti=0;i<=6;i=i+3),即检测3组子弹中每组的第一发,即0,3,6。其次,检测huokebullet[i].no是否等于1,当等于1时使用语句for(intz=i;zpalnepo,通过改变标志位的值使得drawSteing()不在执行,四字消失。
如果玩家被击落后并没有点"返回",而此时,背景会一直运动到关尾,考虑到其与关尾BOSS共用3发子弹,如sboos不消失,将会出现子弹乱飞的情况。所以,如果判断语句if((sboss.getY()==getHeight()))为真,则表示离地图的终点只有一个屏幕的距离时,sbz赋值为-1、sbpzbz赋值为1(含义上面已经说明)。同时调用sboss.move(0,-3),使sboos快速飞出屏幕,直到判断语句if(sboss.getY()<-65)为真时,调用下面的函数setVisable(false),使得sboos不可见。
4.5普通敌人相关属性
普通敌人是指游戏中不断出现的兰色飞机。
首先在程序中首先定义了aik、aip两个Random()类对象,ai和aipp两个整型变量。程序中使用switch(ai)语句判断下一次的飞机出现情况,为了达到不重复出现的效果,使用语句ai=aik.nextInt()%4(同样应该在构造函数中放置此语句和aipp=aip.nextInt()%5,以使每次游戏开始的时候敌人飞机的出现顺序是不固定的),以随机出现0,1,2,3四个整数(代表着飞机的四种出现情况)。
情况1:使用aipp=aip.nextInt()%5取得随机数aipp,根据下面三条语句设置飞机的出现位置:j0.setPosition(100-aipp*30,planepoup+24);
j1.setPosition(100,planepoup);
j2.setPosition(100+aipp*30,planepoup-24);;
将getHeight()/8赋给整型变量kkk,每次循环kkk-1,当kkk<=1时飞机转向,当aipp>0时,飞机向左下方运行,使用语句setFrame(0)、move(-3,3)达成向左下方运动的效果。当aipp<0时,向右下方运动,实现方法同上。
情况2:初始位置设置方法同情况1。当kkk〈0时,飞机掉头向上飞,其中setFrame(3),
move(-4,0)。
情况3:初始位置设置方法同情况1。当kkk〈0时,飞机只向左转。设置情况3的原因是在更多的随机位置出现敌机。
情况4:初始位置设置方法同情况1。但其中的飞机j1具有跟踪能力,其实现方法如下:使用2个if语句if(j1.getX()c1.getX())判断J1在c1的左或右侧,并且实时根据判断情况使用setFrame()和move()改变飞机的形态,使用语句
if((j1.getX()c1.getX())&&(j1.getY()=c1.getX()))&(jbz==0)),即c1在j1左侧18象素范围内或j2左侧6象素范围时,j0、j1、j2一起发射子弹,jbz=1,表示在这组子弹消失前敌人不发射子弹。
如果jpb的值为0,则判断语句if(jpb==0)里的move()语句将一直执行下去。
之后,还需要对每发子弹于玩家飞机进行碰撞检测,如果碰撞,则将碰撞的这发子弹设置为不可见。
4.6白云的实现原理
为了游戏界面更加美观,程序中设定了精灵数组cloud[i]来表示白云,由于白云应该在所有飞机的上方,即cloud[i]应该最早被append()到LayerManager中,或者使用insert(cloud[],0)在索引数值0处插入Layer,本程序采用了第一种方法,即在gameScreen类的构造函数中按游戏设置的顺序使用lm.append()加入到LayerManager之中。
程序中设定白云数为5。首先设置白云的初始位置,其语句如下:
cloud[0].setPosition(25,planepoup-(65));
cloud[1].setPosition(80,planepoup-(140));
cloud[2].setPosition(112,planepoup-(90));
cloud[3].setPosition(175,planepoup-(200));
cloud[4].setPosition(223,planepoup-(70));
其原理为:将屏幕的X数轴和Y数轴各分成5份,即在X轴的5个范围内每个范围出现一朵白云,Y轴的每个范围内也只能出现一朵。所以的白云的起始位置在每次游戏开始时是固定的。
白云位置设定后,使用move(0,1)使白云移动,由于白云初始位置设定在屏幕的不同区域内,故其移动出屏幕的先后顺序是不同的,使用if(cloud[].getY()>planepo)判断白云是否飞出屏幕。如果为真则使用cloud[].setPosition(cloudposition*40,planepoup)设置白云的位置,其中,cloudposition=aicloud.nextInt()%5,aicloud为Random()类对象。乘以40表示其在X轴出现的范围是多少,cloud[0]、cloud[1]、cloud[2]、cloud[3]、cloud[4]乘以的值分别为40,30、55、15、22。以达成白云的随机出现效果。
4.7关尾BOSS及相关属性
关尾处飞机在屏幕上方横向移动,而背景地图不动,所以使用renderboss()重绘屏幕,其中,paint(g,0,0)表示屏幕绘制点在坐标轴(0,0)处。BOSS生命进度条由以下语句绘制:
g.setColor(255,0,0);
g.fillRect(2,2,60,5);//生命进度条背静红
g.setColor(255,255,255);
g.fillRect(2,2,bosslife,5);//生命进度条前景白
其中bosslife记录着BOSS的生命值,其初始值为0,当玩家每击中一次BOSS,其值加5,,即化出白色进度条,当bosslife==60时,表示过关,除玩家飞机与子弹外的其他Sprite均使用setVisable(false)使其不在显示,同样的pzbz要赋予1,以消除玩家飞机还能与敌人碰撞的BUG。
如果cboss.getX()<0,则表示其在屏幕左方出界,应改为右飞。同理如果cboss.getX()
>(getWidth()-cboss.getWidth()),则表示其在屏幕右方出界,应改为左飞。
在飞机横向飞行中,使用以下语句判断飞机是否开火:
if(((cboss.getX()<=c1.getX()-10)||(cboss.getX()<=c1.getX()+60))&&(jbsz==0))
当每发一组子弹后,jbsz=1,则飞机无法开火,知道子弹
飞出屏幕,jbsz才重新设定为0。而((cboss.getX()<=
c1.getX()-10)||(cboss.getX()<=c1.getX()+60)表示当
玩家飞机处于BOSS的左右各10个象素的范围内时。BOSS
开火。关尾参见图4-10。
4.8本章小结
第四章中按照相应的步骤描述了所有关键类的具体算
法实现,引用了相关函数进行了具体流程的解释,并对原
理稍复杂的函数做了详细的分析。对游戏有关的各运行面也做了展示。
5测试
5.1打包测试的过程
使用Eclipse完成代码的调试之后,需要使用WTK生成包(即jar和jad文件),其过程如下:首先,使用WTK的新建项目功能建立一个新项目,要求与Eclipse工作区下的项目名称、MIDlet类名相同(图5-1)。
图5-1
新建项目后,将Eclipse工作区下的.java文件拷入src文件夹,将.class文件拷入class文件夹(需要新建),将pic文件夹拷入res文件夹,点击生成,如一切正常,将如图片5-2所示。
图5-2
之后,选择项目-包-生成包。如图5-3所示。
图5-3
生成的jar和jad文件存储在lzhhdm/bin目录下。
运行MotorolaSDKv4.2forJ2ME,使用MOTOA760手机模拟器进行测试。参考图5-4。点击Lanuch按纽,进入如图5-5的界面,即可以进行游戏测试了。
图5-4
测试的过程,实际上就是找不同的同学玩这款游戏,以期望发现BUG。实际上,几乎每一版本都会产生很多BUG。
5.2发现的BUG及解决情况
几乎每一个计算机程序都会有这样
那样的不足,尤其是未经过精心维护的
非商业软件。即使是作为操作系统的各
种版本的Windows也时常会发生许多类
型的错误和漏洞。本游戏程序对于初涉
此领域的毕业设计课题来说,尤其在开
始初期,感觉逻辑复杂,难以控制,因
此产生了大量BUG,其中一些BUG还没有
解决,所有发现的BUG如下:
1.玩家子弹出现顺序问题;
2.玩家飞机爆炸后仍然可以控制爆
炸图片;
3.当过关后仍然会发生碰撞;
4.当玩家击落可奖人飞机的同时玩
家被击落,并且此为玩家的最后
一架飞机,虽然显示援军到达,但
游戏仍然结束。
5.有某组飞机在飞机被击中后仍能发射子弹;
6.sboos左侧子弹发射后不停在原位置刷新问题;
7.游戏运行一段时间后变的很卡;
其中,1、2、3、4条BUG已经解决(方法已在第4章相关位置进行了说明)。4、5、6没有解决,其中,4、5、6三条如果有足够的时间可以解决。第7条以现有水平无法解决,因为出现这种情况的原因估计是内存的问题,而由于水平的关系,现在的代码变量过多,并且效率低下,有很多重复的地方,解决的方法只能是在水平提高的情况下重写整个程序。
5.3未完善的功能
经过汇总测试人员的建议,本游戏应该完善的功能如下
1.由于每按一次开火,就会对玩家子弹的精灵数组进行一次循环检查,使得本运行效率就不高的KVM运行异常缓慢。即使刷屏没有间隔也不会提高速度;
2.最好有接宝物的设置,增强可玩性;
3.由于没由合适的图片,使得敌人设置单一;
4.地图本应由外部文件读入,但设计初期并没有掌握这项技术;
5.手机游戏最好只有一个类,而我却有4个;
7.没有添加成绩记录,即英雄榜;
6.最大的遗憾,敌人不够智能化。
希望不远的将来,我能够有能力对这个游戏进行重写,以解决BUG、完善功能。
6总结
6.1本程序的总结和展望
本程序设计实现了手机上以J2ME为平台的飞行射击游戏的开发,敌人运行的方式由程序进行控制,具有一定的可玩性和复杂性。经过了细心的调试和排错解决了绝大部分的问题。
但是我的水平实在有限,在第5章列举的众多BUG和遗憾就可以看出这一点来,但我相信,随着时间的推移,个人水平的增长,我一定会重写这个程序,使其更加完善,
6.2感想
这款游戏作为我的毕业设计,是本人目前做过的最有意义的程序,这期间对J2ME的学习,使我又回到了初学PASCAL的时候。
本科期间做过很多课程设计,大多规模很小。在数据库、各种应用软件和游戏中,我仍觉得对游戏的设计有极大的热情。因为其各个模块间的联系十分紧密,代码重复执行率高,当经过无数次的调试、修改后,能最终看到成品,有无比自豪的心情。大学期间做过图书馆管理程序等简单的数据库管理系统的课程设计,思想大致相似,变化范围有限,没有太多自己可发挥的余地。大家作品的最终结果都离不开同一个模式。相比一些数据库软件,游戏的设计有很多人情色彩和艺术思想的发挥,正式商业的软件的人性化界面和各个游戏间迥异的结构每每会让人有去开发的冲动。
学习J2ME的困难远远超出了想象,在设计初期,为了解决地图的滚动、玩家飞机如何不飞出上下边界两个问题竟然花费了数天的时间。很多相关的技术,如需要使用到的线程、Game包的新功能、高级、低级图形界面的使用、贴图等,每一项都需要花一定的时间去掌握和熟悉。更为困难的是,J2ME为一种刚出现仅几年的新技术,国内的参考资料非常少,仅有的几本也停留在简单的介绍阶段。台湾的王森写了本较好的书,给了我很大的帮助,但对设计该游戏来说,仍只够入门。
幸运的是,互联网上有那么多无私的人,由JasonLam著,DeabowayChou译的电子书《J2ME&Gaming》给了我很大的帮助,作者、译者的辛勤劳动的成果免费放在网上由大家下载,是开源精神的完美体现。
致谢
首先感谢我的指导老师教授,她在我的毕业设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新兴的技术。
感谢黄明旭、包明辉同学对游戏进行测试,感谢同学对游戏相关图片的修改。
感谢答辩组对本毕业设计的考核,如果可以得到专家的认可将对我的学习和工作给予极大的鼓励。你们客观的评价和建议我将牢记在心,在今后的发展中扬长避短,更加努力的严格要求自己。
参考文献
[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版.机械工业出版社.
[6]JasonLam著.Deabo wayChou译J2ME&Gaming2004年末www.jasonlanm604.com
[7]陈立伟张克非黎秀红著.精通JAVA手机游戏与应用程序设计.中国青年出版社.
2005年5月
[8]飞思科技产品研发中心.精通Jbuilder9.电子工业出版社.2004年
[9]微型爪哇人.Java手机程序开发.中国铁道出版社,2003年
[10]FrandM.Carrano,JanetJ.Prichard.著韩志宏译.数据抽象和问题求解--
JAVA语言描述.清华大学出版社2005年4月
[11]袁海燕王文涛著.JAVA实用程序设计100例.人民邮电出版社.2005年5月
[12]JonathanKnudsen.What'sNewintheJ2MEWirelessToolkit2.22004年4月www.sun.com
附录一代码
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
importjavax.microedition.lcdui.*;
publicclasslzhhdmextendsMIDletimplementsCommandListener{
publicDisplaydisplay;
privateImagesplashLogo;
privatebooleanisSplash=true;
publicForma;
privateAlertalert;
intlength;
privateMenuScreenmenuscreen;
privategameScreengamescreen;
privateCommandok,back;
privatebyte[]byteInputData;
publiclzhhdm()
{
}
protectedvoidstartApp()throwsMIDletStateChangeException{
display=Display.getDisplay(this);
menuscreen=newMenuScreen(this);
if(isSplash)
{a=null;
a=newForm("览桥风光V1.0");
ok=newCommand("ok",Command.OK,1);
a.append(newStringItem(null,"....."));
a.addCommand(ok);
a.setCommandListener(this);
display.setCurrent(a);
}
}
protectedvoidmenuscreenShow()
{
display.setCurrent(menuscreen);
}
protectedvoidmenuscreensecond(){
menuscreen=newMenuScreen(this);
MenuScreen.mainmenu[0]="重新开始";//玩完一遍或挂了后在玩一遍菜单第一项改为重新开始
display.setCurrent(menuscreen);
}
protectedvoidpauseApp(){}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{
}
protectedvoidhelShow()
{a=null;
a=newForm("览桥风光V1.0");
back=newCommand("返回",Command.BACK,1);
a.append(newStringItem(null,"操作方式:上2下8左4右6开火5"));
a.append(newStringItem(null,"弹药数:一次最多打三组"));
a.addCommand(ok);
a.setCommandListener(this);
display.setCurrent(a);
}
protectedvoidrenwuShow()
{
a=null;
a=newForm("览桥风光V1.0");
back=newCommand("返回",Command.BACK,1);
a.append(newStringItem(null,"游戏名称:览桥风光"));
a.append(newStringItem(null,"版本号:V1.00"));
a.append(newStringItem(null,"制作者:信息电子技术学院01计算机5班刘泽华ddCommand(ok);
a.setCommandListener(this);
display.setCurrent(a);
}
protectedvoidgameShow()
{try{
gamescreen=null;
gamescreen=newgameScreen(this);
gamescreen.start();
display.setCurrent(gamescreen);
gamescreen.conti=true;
}catch(Exceptionexp)
{
System.out.println("dfg");
}
}
publicvoidcommandAction(Commandarg0,Displayablearg1){
a=null;
this.menuscreenShow();
}
}
importjavax.microedition.lcdui.*;
publicclassMenuScreenextendsCanvasimplementsRunnable,CommandListener
{
Fontlowfont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_MEDIUM);
Fonthighfont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
intlowColor=0x000000FF;
inthighColor=0x00FF0000;
inthighBGColor=0x00CCCCCC;
intwidth;
booleanco;
intheight;
intstartHeight;
intspacing=highfont.getHeight()/2;
publicstaticString[]mainmenu={"D?ó??·","°??ú","1?óú"};
intmenuIndex;
ThreadmenuThread;
privateCommandok=newCommand("ok",Command.OK,1);
privatelzhhdmmidlet;
publicMenuScreen(lzhhdmmidlet)
{ this.midlet=midlet;
width=getWidth();
height=getHeight();
startHeight=(highfont.getHeight()*mainmenu.length)+((mainmenu.length-1)*spacing);
startHeight=(height-startHeight)/2;
menuIndex=0;
addCommand(ok);
setCommandListener(this);
menuThread=newThread(this);
menuThread.start();
co=true;
}
publicvoidrun()
{
while(co)
{
repaint();
}
}
publicvoidpaint(Graphicsg)
{
g.setColor(0x00FFFFFF);
g.fillRect(0,0,width,height);
for(inti=0;i=0)
{
menuIndex--;
}
elseif(getGameAction(code)==Canvas.DOWN&&menuIndex+10)
{huokebullet[3].newposition(huokebullet,3,3,j0,j1,j2,cboss,img("/pic/explosion.png")); }
if(huokebullet[3].no<=0)
{huokebullet[3].setAlive(3);
huokebullet[3].clean(3,huokebullet);
}} if(huokebullet[6].isAlive(6))
{huokebullet[6].no--;
if(huokebullet[6].no>0){ huokebullet[6].newposition(huokebullet,6,3,j0,j1,j2,cboss,img("/pic/explosion.png")); }
if(huokebullet[6].no<=0){huokebullet[6].setAlive(6);
huokebullet[6].clean(6,huokebullet);}}if(huokebullet[0].collidesWith(cboss,true))
{huokebullet[0].setVisible(false); huokebullet[1].setVisible(false); huokebullet[2].setVisible(false);
cboss.setFrame(1);
if(bosslife<=55)
{bosslife=bosslife+5;}
huokebullet[0].setAlive(0);huokebullet[0].clean(0,huokebullet);}if(huokebullet[0].collidesWith(sboss,true)&&(sbpzbz==0)){ huokebullet[0].setVisible(false);
huokebullet[1].setVisible(false); huokebullet[2].setVisible(false);
sboss.setFrame(1);
if(slife<=75){slife=slife+5;}
huokebullet[0].setAlive(0); huokebullet[0].clean(0,huokebullet);if(huokebullet[3].collidesWith(cboss,true)){cboss.setFrame(1); huokebullet[3].setVisible(false);
huokebullet[4].setVisible(false); huokebullet[5].setVisible(false);
huokebullet[3].no=0;
if(bosslife<=55){
bosslife=bosslife+5;}
huokebullet[3].setAlive(3);huokebullet[3].clean(3,huokebullet);}
if(huokebullet[3].collidesWith(sboss,true)&&(sbpzbz==0)){sboss.setFrame(1);
huokebullet[3].setVisible(false);
huokebullet[4].setVisible(false);
huokebullet[5].setVisible(false);
huokebullet[3].no=1;
if(slife<=75){slife=slife+5;}
huokebullet[3].setAlive(3);huokebullet[3].clean(3,huokebullet);}
if(huokebullet[6].collidesWith(cboss,true)){ huokebullet[6].setVisible(false); huokebullet[7].setVisible(false);
huokebullet[8].setVisible(false);
cboss.setFrame(1);
if(bosslife<=55){bosslife=bosslife+5;
}huokebullet[6].setAlive(6);huokebullet[6].clean(6,huokebullet);
}if(huokebullet[6].collidesWith(sboss,true)&&(sbpzbz==0)){sboss.setFrame(1);
huokebullet[6].setVisible(false); huokebullet[7].setVisible(false); huokebullet[8].setVisible(false);
if(slife<=75){slife=slife+5;}
huokebullet[6].setAlive(6); huokebullet[6].clean(6,huokebullet);;}if((y1>-1350)&&(pzbzover==0))
{
switch(ai){
上一篇:JAVA在线考试(论文和程序)
下一篇:试题库管理系统毕业论文