论文无忧网提供:计算机毕业论文范文|计算机毕业设计|计算机毕业论文
栏目导航 ASP Java Web .NET VB6.0 JAVA VC VF DELPHI PB 计算机网络 计算机科学与技术 PHP 安卓APP 其他 C# 代写论文
当前位置: > 计算机 > JAVA >

A400102打飞机游戏毕业设计

4.3.5 关于commandAction()方法

每个创建Command实例的J2ME的应用程序也必须创建实现CommandListener接口的实例。每当用户通过commandAction()方法的方式与命令进行交互的时候,就会通过CommandLIstener.所以实现CommandListener的类必须实现commandAction()方法。 copyright paper51.com

在commandAction()方法中,使用getabel()方法获取命令的标签。如果getLabel()=“暂停”时,表示玩家点击了暂停键,此时,conti赋值为false,游戏画面的绘制及游戏相关的运算暂停,并且,使用removeCommand(c)语句将“暂停”移除,使用addCommand(newCommand("继续",Command.OK,2));将”继续“按纽”添加进来。当玩家点击“继续“时,conti赋值为true,并且,一定要调用start()方法,否则继续功能不可用。必须调用start()方法的原因是:J2ME的线程已stop()方法拿掉,如果想停止线程的运做,就必须依靠一个旗标(flag),在本程序中,flag就是boolean型变量conti。所以一旦此标识变量被设为false,那么while(conti)循环就会结束,线程也会跟着结束。当用户按下“继续”的时候,start()将重新产生一个线程继续执行相关的运算和画面绘制。

copyright paper51.com

当玩家通关时或者任务失败时,将显示相应信息,并使用上面的方法将“暂停”键变为“返回”键盘,当点击“返回”键时,将返回主菜单选项,调用类lzhhdm里的方法menuscreensecond(),在此方法中,实例化一个MenuScreen类对象,并且使选项“新游戏”改变为”重新开始“(图4-7)。完成此项功能的语句子为MenuScreen.mainmenu[0] =”重新开始”。当选择”重新开始“时,使用gamescreen=newgameScreen(this)将使所有变量重新被初始化,如地图的绘制、敌人出现位置的重置、敌人的数量、玩家飞机的当前位置等。使用gamescreen.start()重新开始程序的循环。

copyright paper51.com

4.3.6 Sprite类对象的碰撞检测及相关属性 内容来自www.paper51.com

    游戏进行中,即在while(conti){ }中,需要进行玩家飞 paper51.com

机、子弹与敌机及敌机子弹与玩家飞机的碰撞检测,即使用函

内容来自www.paper51.com

数collidesWith(Sprite,boolean)。由于设计的问题,玩家发 内容来自论文无忧网 www.paper51.com

射的子弹与普通敌机的碰撞检测被写在了mybullets类中,并

copyright paper51.com

且只检测第一发子弹是否与敌人相碰撞,如果碰撞为真时,则 内容来自www.paper51.com

使用setVisible(false)函数将敌机隐藏,使用setImage()函 内容来自论文无忧网 www.paper51.com

数将子弹精灵的三张图片置换为爆炸图片( 图4-8 )。当敌人剩 copyright paper51.com

余飞机消失后,即所有的敌人都飞出了屏幕后,使用函数 paper51.com

setVisible(true)将敌机重新设置为可见。在按“开火”键时,使用setImage()函数将huokebullets重新设定为子弹图片(每次击落敌机后屏幕上的爆炸效果有3团,并且按“开火”后爆炸图片就消失了,实际上setVisavle(false)的应该是子弹数组,而对敌人精灵使用setImage(),这样效果会好一些)。 http://www.paper51.com

敌机与玩家的碰撞检测原理同上,都是使用的collidesWith()函数,遗憾的是,我在写这段代码的时候,并没有考虑设置玩家有4次机会,所以对敌人飞机setVisable(fasle)了,而将玩家的飞机换成了爆炸图片,之后,添加了玩家4次机会这个功能,由于玩家被击落后会重新从屏幕下方进入屏幕,所以爆炸的图片一闪而过,效果不是很好。

内容来自论文无忧网 www.paper51.com

4.3.7 玩家4次游戏机会的实现方法        

paper51.com

    根据游戏设置,玩家在每关中有共四次机会,当玩家飞机被击中或撞击爆炸后,程序首先检测整型变量playerno的值,并根据playerno的值决定屏幕右上角所画玩家飞机标志的数量(参考图4-8),playerno的初始值设为3,因为碰撞后才减1,所以玩家共有4次机会,当playerno<0时,游戏结束,同时将变量pver赋值为1,render()或renderboss()函数中,over=1代表在屏幕上GAMEOVER等相关信息,同时,将整型变量inputno赋植为1,以使手机的方向键失效,以消除玩家可以控制爆炸图像移动这个BUG。同时整型变量pzbz赋植为1,以消除玩家爆炸图像继续与敌人进行碰撞检测这个BUG。

paper51.com

    当playerno>0时,碰撞后,将变量planert赋值为1,在之后的if(planert==1)判断语句中,重新设定玩家飞机的图片和可视状态,同时使用setPosition()函数设定玩家非的位置在屏幕下方。设定pzbz=1,即不检测碰撞,玩家有短暂时间无敌,无敌时间由屏幕右上角进度条表示。设定inputno=1,即飞入屏幕的过程中手机键盘是不可以用的。设置planert=2,即以上这些设置只执行一便。 http://www.paper51.com

     在if(planert==2)判断语句中,使用语句move( paper51.com

0,-2)使飞机自己向上运动,使用if(c1.getY()<(

内容来自论文无忧网 www.paper51.com

planepo-24))判断飞机是否到达屏幕最下方(planepo

copyright paper51.com

是屏幕下边缘的坐标),如条件为真,则将inputno 内容来自www.paper51.com

设置为1,表示键盘可用,将planert赋值为3,使

http://www.paper51.com

其不再执行以上各步。

http://www.paper51.com

4.3.8 input() 内容来自论文无忧网 www.paper51.com

 input()函数的作用是检测用户的输入。

内容来自论文无忧网 www.paper51.com

首先使用if(inputno==0)判断用户的输入是否

内容来自论文无忧网 www.paper51.com

被禁止,如为真,则用户输入不被禁止。

内容来自论文无忧网 www.paper51.com

内容来自www.paper51.com

图4-8 游戏界面

内容来自www.paper51.com

其次,调用getKeyStates()查询按键的状态。 http://www.paper51.com

当玩家按方向键时,玩家飞机就向不同的方向运行,这需要使用c1.move(int x,int y)函数,当玩家控制飞机向左或右飞时,需要使c1.setFrame()函数改变飞机的图形(参见图4-7,此时飞机右飞)。同时,还需要判断飞机是否飞出屏幕,如,当飞机右飞时,用if(c1.getX()>(getWidth()-c1.getWidth())) copyright paper51.com

语句判断(getWith()为屏幕的宽度,c1.getWidth()为玩家飞机c1的宽度),如果条件为真,则使用c1.setPosition((getWidth()-c1.getWidth()),c1.getY())语句将飞机设置在紧靠屏幕右边的位置。上、下、左的设置原理同上。

http://www.paper51.com

    语句if((keystate&LEFT_PRESSED)==0)的作用是消除左、右飞后在上、下飞时飞机的形态不变的BUG。如果为真,则执行语句c1.setFrame(0),表示只要左键松开飞机的形态都是平飞。 paper51.com

根据游戏设定,玩家一次最多只能发三组子弹,并且子弹有射程限制(在类mybullets中使用整型变量no表示),而当玩家按下“开火“键时,即if((keystate&FIRE_PRESSED)!=0)中判断条件为真时,首先执行循环语句for(int i=0;i<=6;i=i+3),即检测3组子弹中每组的第一发,即0,3,6。其次,检测huokebullet[i].no是否等于1,当等于1时使用语句for( int z=i;z<i+3;z++)初始化该组子弹中的3发子弹,而设置子弹位置的函数应该在if(huokebullet[i].no==1)语句外设置,因为当初设计的时候mybullets类里的函数写成了一次设置三组子弹的形式。

paper51.com

huokebullet[z].no=huokebullet[z].bulletheight赋予子弹射程。当程序循环运行时no--,当一次发射了三组子弹后,只有某一组子弹消失,即no等于1后才能继续发射子弹。 http://www.paper51.com

现在看来,玩家发射子弹的设置是完全失败的,降低了效率。 内容来自www.paper51.com

4.3.9 render()和renderboss()

paper51.com

在方法render()过程中,除了要重绘飞机、地图、子弹外还要在上方绘制关卡信息、战果、玩家飞机数、及无敌状态时的无敌时间、大飞机生命条等。 copyright paper51.com

首先使用lm.setViewWindow()和lm.paint()设定可视范围ViewWindow和从哪里画起(见4.3.3)。 内容来自www.paper51.com

其次,使用g.drawString()绘制屏幕上方的关卡信息、战绩、玩家剩余生命标志。 http://www.paper51.com

drawString()中使用String.valueOf(huokebullet[0].rscore()+huokebullet[3]. copyright paper51.com

rscore()+huokebullet[6].rscore())返回玩家成绩score的字符串表示。

http://www.paper51.com

其中根据playerno的值绘出玩家的飞机标志数(应该有更好方法,但是没有想到 )当每次刷新绘图页面时,应使用GameCanvas的flushGraphics()将屏幕后台的缓冲区内的图像刷新到前台来(flushGraphics()应该写在render(){ }的最后)。 内容来自www.paper51.com

renderboss()方法重绘的是关尾的精灵cboss、相关信息等,与render()的区别在与于函数lm.paint(g,0,0),起始坐标是不可变的,即,关尾的地图背景是不可变的。实际上,renderboss()是完全不需要的,只要在render()函数中设置相关标志位就可以解决关尾的绘图问题。 copyright paper51.com

------分隔线----------------------------
联系方式