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

A450Java游戏设计打飞机程序+论文

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

内容来自www.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,即以上这些设置只执行一便。

copyright paper51.com

     在if(planert==2)判断语句中,使用语句move( 内容来自www.paper51.com

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

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

paper51.com

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

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

copyright paper51.com

其不再执行以上各步。 内容来自www.paper51.com

4.3.8 input()

paper51.com

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

http://www.paper51.com

首先使用if(inputno==0)判断用户的输入是否 内容来自论文无忧网 www.paper51.com

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

paper51.com

http://www.paper51.com

图4-8 游戏界面 paper51.com

其次,调用getKeyStates()查询按键的状态。 copyright 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())语句将飞机设置在紧靠屏幕右边的位置。上、下、左的设置原理同上。 内容来自论文无忧网 www.paper51.com

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

内容来自www.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类里的函数写成了一次设置三组子弹的形式。 内容来自www.paper51.com

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

现在看来,玩家发射子弹的设置是完全失败的,降低了效率。

http://www.paper51.com

4.3.9 render()和renderboss() http://www.paper51.com

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

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

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

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

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

内容来自www.paper51.com

rscore()+huokebullet[6].rscore())返回玩家成绩score的字符串表示。 内容来自论文无忧网 www.paper51.com

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

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

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

copyright paper51.com

玩家飞机的生命标志使用drawImage()就可以绘制在屏幕上了。 内容来自www.paper51.com

4.4 游戏中的奖励及相关飞机的行为

内容来自www.paper51.com

    根据游戏设定,当y1=-1000时,会出现如图4-8

copyright paper51.com

所示的飞机(sboss),当玩家击落他后,屏幕会显示“ http://www.paper51.com

援军到达“,并且玩家剩余飞机数加1。

内容来自www.paper51.com

    使用 if((y1==-1000)&&(sbz==0)){ }设定sboss的 http://www.paper51.com

初始位置,根据游戏设定,sboos从屏幕上方倒飞入屏幕, 内容来自论文无忧网 www.paper51.com

所以sboss设定的初始位置(50,planepoup-65),其中 内容来自www.paper51.com

planepoup为屏幕上边缘的标志位。

copyright paper51.com

内容来自www.paper51.com

图4-9

http://www.paper51.com

最后,要将sbz赋值为1,消除sboos不停设置初始位置的BUG。 内容来自论文无忧网 www.paper51.com

    当sboss飞入屏幕后,将sbz赋值为2,以执行下面 http://www.paper51.com

的if(sbz==2)语句。 copyright paper51.com

内容来自www.paper51.com

图4-10

copyright paper51.com

   在判断语句if(sbz==2)里,将根据玩家的位置自动飞 copyright paper51.com

行。首先,根据玩家飞机的位置对sbmove赋值,当c1在sboos的上、下、左、右时,其对应的值为1、2、3、4在这4个if语句中,要设置标志位(smovebz==0)。设置这个

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

标志位的目的是防止sboos根据c1的位置不停的改变运行状态,即防止sboos成为跟踪飞机。当sboos根据c1的位置改变一次运行方向后,smovebz赋值为1,即不检测c1 copyright paper51.com

的位置。只有sboss运行到屏幕的边缘时,才将smovebz重新赋值为0,使其可以再次通过c1的位置决定sboos的运行方向。

copyright paper51.com

当玩家子弹击中sboss后,使用sboss.setFrame(1),此时飞机变红,在本次repaint结束前,使用sboss.setFrame(0)使飞机变为本来颜色,而程序设定每1/20秒画一次,由此得到飞机被击中后变色的效果。(参见图4-10)。

http://www.paper51.com

    sboos会根据玩家飞机的位置发射子弹,根据游戏设置,当玩家在其上方、左方、右方时,sboss一次发射1发子弹,而玩家飞机在其下方时,sboss一次发射3发子弹。                        

内容来自www.paper51.com

    sboss与cboss共用3发子弹,因为当sboss出现时,离关尾还远,所以,为了提高效率,采用这种方法。

copyright paper51.com

    如果sboos被击落后,使用函数setVisable(false)将bossbullet0、bossbullet1、bossbullet2设置为不见,使用sboss.setImage()函数将sboos的图片设置为爆炸图片。同时,玩家生命标志playerno加1,sbz赋值为-1,使得sboos无法发射子弹,sbpzbz赋值为1,使得玩家的子弹不与sboos进行碰撞检测。

内容来自www.paper51.com

    同时在屏幕中使用drawString()绘制“援军到达”四个字,随着屏幕的运动,爆炸图片逐渐进入屏幕下方,当sboos.getY()>palnepo,通过改变标志位的值使得drawSteing()不在执行,四字消失。 paper51.com

    如果玩家被击落后并没有点“返回“,而此时,背景会一直运动到关尾,考虑到其与关尾BOSS共用3发子弹,如sboos不消失,将会出现子弹乱飞的情况。所以,如果判断语句if((sboss.getY()==getHeight()))为真,则表示离地图的终点只有一个屏幕的距离时,sbz赋值为-1、sbpzbz赋值为1(含义上面已经说明)。同时调用sboss.move(0,-3),使sboos快速飞出屏幕,直到判断语句if(sboss.getY()<-65)为真时,调用下面的函数setVisable(false),使得sboos不可见。

http://www.paper51.com

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