怎么用Java实现飞机大战
这篇文章将为大家详细讲解有关怎么用Java实现飞机大战,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
前言《飞机大战》是一款融合了街机、竞技等多种元素的经典射击手游。华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣。
游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。
主要需求:
玩家控制一台战斗机,以保证自己不被敌机消灭,消灭越多的敌机可以收取能量,补充玩家战斗机数量。玩家战斗机数量为0,则游戏结束。
主要设计1、 用Swing库做可视化界面,画玩家战斗机,不同的敌机,画背景图,画子弹
2、鼠标控制战斗机移动
3、 用线程实现画面刷新。
4、随机生成敌机算法
5、分数计算算法
6、子弹和飞行物之间的碰撞算法
功能截图游戏开始
游戏暂停
游戏结束
代码实现启动类publicclassShootGameextendsJPanel{publicstaticfinalintWIDTH=400;//面板宽publicstaticfinalintHEIGHT=654;//面板高/***游戏的当前状态:STARTRUNNINGPAUSEGAME_OVER*/privateintstate;privatestaticfinalintSTART=0;privatestaticfinalintRUNNING=1;privatestaticfinalintPAUSE=2;privatestaticfinalintGAME_OVER=3;privateintscore=0;//得分privateTimertimer;//定时器privateintintervel=1000/100;//时间间隔(毫秒)publicstaticBufferedImagebackground;publicstaticBufferedImagestart;publicstaticBufferedImageairplane;publicstaticBufferedImagebee;publicstaticBufferedImagebullet;publicstaticBufferedImagehero0;publicstaticBufferedImagehero1;publicstaticBufferedImagepause;publicstaticBufferedImagegameover;privateFlyingObject[]flyings={};//敌机数组privateBullet[]bullets={};//子弹数组privateHerohero=newHero();//英雄机static{//静态代码块,初始化图片资源try{background=ImageIO.read(ShootGame.class.getResource("background.png"));start=ImageIO.read(ShootGame.class.getResource("start.png"));airplane=ImageIO.read(ShootGame.class.getResource("airplane.png"));bee=ImageIO.read(ShootGame.class.getResource("bee.png"));bullet=ImageIO.read(ShootGame.class.getResource("bullet.png"));hero0=ImageIO.read(ShootGame.class.getResource("hero0.png"));hero1=ImageIO.read(ShootGame.class.getResource("hero1.png"));pause=ImageIO.read(ShootGame.class.getResource("pause.png"));gameover=ImageIO.read(ShootGame.class.getResource("gameover.png"));}catch(Exceptione){e.printStackTrace();}}/***画*/@Overridepublicvoidpaint(Graphicsg){g.drawImage(background,0,0,null);//画背景图paintHero(g);//画英雄机paintBullets(g);//画子弹paintFlyingObjects(g);//画飞行物paintScore(g);//画分数paintState(g);//画游戏状态}/***画英雄机*/publicvoidpaintHero(Graphicsg){g.drawImage(hero.getImage(),hero.getX(),hero.getY(),null);}/***画子弹*/publicvoidpaintBullets(Graphicsg){for(inti=0;i<bullets.length;i++){Bulletb=bullets[i];g.drawImage(b.getImage(),b.getX()-b.getWidth()/2,b.getY(),null);}}/***画飞行物*/publicvoidpaintFlyingObjects(Graphicsg){for(inti=0;i<flyings.length;i++){FlyingObjectf=flyings[i];g.drawImage(f.getImage(),f.getX(),f.getY(),null);}}/***画分数*/publicvoidpaintScore(Graphicsg){intx=10;//x坐标inty=25;//y坐标Fontfont=newFont(Font.SANS_SERIF,Font.BOLD,22);//字体g.setColor(newColor(0xFF0000));g.setFont(font);//设置字体g.drawString("SCORE:"+score,x,y);//画分数y=y+20;//y坐标增20g.drawString("LIFE:"+hero.getLife(),x,y);//画命}/***画游戏状态*/publicvoidpaintState(Graphicsg){switch(state){caseSTART://启动状态g.drawImage(start,0,0,null);break;casePAUSE://暂停状态g.drawImage(pause,0,0,null);break;caseGAME_OVER://游戏终止状态g.drawImage(gameover,0,0,null);break;}}publicstaticvoidmain(String[]args){JFrameframe=newJFrame("Fly");ShootGamegame=newShootGame();//面板对象frame.add(game);//将面板添加到JFrame中frame.setSize(WIDTH,HEIGHT);//设置大小frame.setAlwaysOnTop(true);//设置其总在最上frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认关闭操作frame.setIconImage(newImageIcon("images/icon.jpg").getImage());//设置窗体的图标frame.setLocationRelativeTo(null);//设置窗体初始位置frame.setVisible(true);//尽快调用paintgame.action();//启动执行}/***启动执行代码*/publicvoidaction(){//鼠标监听事件MouseAdapterl=newMouseAdapter(){@OverridepublicvoidmouseMoved(MouseEvente){//鼠标移动if(state==RUNNING){//运行状态下移动英雄机--随鼠标位置intx=e.getX();inty=e.getY();hero.moveTo(x,y);}}@OverridepublicvoidmouseEntered(MouseEvente){//鼠标进入if(state==PAUSE){//暂停状态下运行state=RUNNING;}}@OverridepublicvoidmouseExited(MouseEvente){//鼠标退出if(state==RUNNING){//游戏未结束,则设置其为暂停state=PAUSE;}}@OverridepublicvoidmouseClicked(MouseEvente){//鼠标点击switch(state){caseSTART:state=RUNNING;//启动状态下运行break;caseGAME_OVER://游戏结束,清理现场flyings=newFlyingObject[0];//清空飞行物bullets=newBullet[0];//清空子弹hero=newHero();//重新创建英雄机score=0;//清空成绩state=START;//状态设置为启动break;}}};this.addMouseListener(l);//处理鼠标点击操作this.addMouseMotionListener(l);//处理鼠标滑动操作timer=newTimer();//主流程控制timer.schedule(newTimerTask(){@Overridepublicvoidrun(){if(state==RUNNING){//运行状态enterAction();//飞行物入场stepAction();//走一步shootAction();//英雄机射击bangAction();//子弹打飞行物outOfBoundsAction();//删除越界飞行物及子弹checkGameOverAction();//检查游戏结束}repaint();//重绘,调用paint()方法}},intervel,intervel);}intflyEnteredIndex=0;//飞行物入场计数/***飞行物入场*/publicvoidenterAction(){flyEnteredIndex++;if(flyEnteredIndex%40==0){//400毫秒生成一个飞行物--10*40FlyingObjectobj=nextOne();//随机生成一个飞行物flyings=Arrays.copyOf(flyings,flyings.length+1);flyings[flyings.length-1]=obj;}}/***走一步*/publicvoidstepAction(){for(inti=0;i<flyings.length;i++){//飞行物走一步FlyingObjectf=flyings[i];f.step();}for(inti=0;i<bullets.length;i++){//子弹走一步Bulletb=bullets[i];b.step();}hero.step();//英雄机走一步}/***飞行物走一步*/publicvoidflyingStepAction(){for(inti=0;i<flyings.length;i++){FlyingObjectf=flyings[i];f.step();}}intshootIndex=0;//射击计数/***射击*/publicvoidshootAction(){shootIndex++;if(shootIndex%30==0){//300毫秒发一颗Bullet[]bs=hero.shoot();//英雄打出子弹bullets=Arrays.copyOf(bullets,bullets.length+bs.length);//扩容System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);//追加数组}}/***子弹与飞行物碰撞检测*/publicvoidbangAction(){for(inti=0;i<bullets.length;i++){//遍历所有子弹Bulletb=bullets[i];bang(b);//子弹和飞行物之间的碰撞检查}}/***删除越界飞行物及子弹*/publicvoidoutOfBoundsAction(){intindex=0;//索引FlyingObject[]flyingLives=newFlyingObject[flyings.length];//活着的飞行物for(inti=0;i<flyings.length;i++){FlyingObjectf=flyings[i];if(!f.outOfBounds()){flyingLives[index++]=f;//不越界的留着}}flyings=Arrays.copyOf(flyingLives,index);//将不越界的飞行物都留着index=0;//索引重置为0Bullet[]bulletLives=newBullet[bullets.length];for(inti=0;i<bullets.length;i++){Bulletb=bullets[i];if(!b.outOfBounds()){bulletLives[index++]=b;}}bullets=Arrays.copyOf(bulletLives,index);//将不越界的子弹留着}/***检查游戏结束*/publicvoidcheckGameOverAction(){if(isGameOver()==true){state=GAME_OVER;//改变状态}}/***检查游戏是否结束*/publicbooleanisGameOver(){for(inti=0;i<flyings.length;i++){intindex=-1;FlyingObjectobj=flyings[i];if(hero.hit(obj)){//检查英雄机与飞行物是否碰撞hero.subtractLife();//减命hero.setDoubleFire(0);//双倍火力解除index=i;//记录碰上的飞行物索引}if(index!=-1){FlyingObjectt=flyings[index];flyings[index]=flyings[flyings.length-1];flyings[flyings.length-1]=t;//碰上的与最后一个飞行物交换flyings=Arrays.copyOf(flyings,flyings.length-1);//删除碰上的飞行物}}returnhero.getLife()<=0;}/***子弹和飞行物之间的碰撞检查*/publicvoidbang(Bulletbullet){intindex=-1;//击中的飞行物索引for(inti=0;i<flyings.length;i++){FlyingObjectobj=flyings[i];if(obj.shootBy(bullet)){//判断是否击中index=i;//记录被击中的飞行物的索引break;}}if(index!=-1){//有击中的飞行物FlyingObjectone=flyings[index];//记录被击中的飞行物FlyingObjecttemp=flyings[index];//被击中的飞行物与最后一个飞行物交换flyings[index]=flyings[flyings.length-1];flyings[flyings.length-1]=temp;flyings=Arrays.copyOf(flyings,flyings.length-1);//删除最后一个飞行物(即被击中的)//检查one的类型(敌人加分,奖励获取)if(oneinstanceofEnemy){//检查类型,是敌人,则加分Enemye=(Enemy)one;//强制类型转换score+=e.getScore();//加分}else{//若为奖励,设置奖励Awarda=(Award)one;inttype=a.getType();//获取奖励类型switch(type){caseAward.DOUBLE_FIRE:hero.addDoubleFire();//设置双倍火力break;caseAward.LIFE:hero.addLife();//设置加命break;}}}}/***随机生成飞行物**@return飞行物对象*/publicstaticFlyingObjectnextOne(){Randomrandom=newRandom();inttype=random.nextInt(20);//[0,20)if(type<4){returnnewBee();}else{returnnewAirplane();}}}玩家飞机
publicclassHeroextendsFlyingObject{privateBufferedImage[]images={};//英雄机图片privateintindex=0;//英雄机图片切换索引privateintdoubleFire;//双倍火力privateintlife;//命/**初始化数据*/publicHero(){life=3;//初始3条命doubleFire=0;//初始火力为0images=newBufferedImage[]{ShootGame.hero0,ShootGame.hero1};//英雄机图片数组image=ShootGame.hero0;//初始为hero0图片width=image.getWidth();height=image.getHeight();x=150;y=400;}/**获取双倍火力*/publicintisDoubleFire(){returndoubleFire;}/**设置双倍火力*/publicvoidsetDoubleFire(intdoubleFire){this.doubleFire=doubleFire;}/**增加火力*/publicvoidaddDoubleFire(){doubleFire=40;}/**增命*/publicvoidaddLife(){//增命life++;}/**减命*/publicvoidsubtractLife(){//减命life--;}/**获取命*/publicintgetLife(){returnlife;}/**当前物体移动了一下,相对距离,x,y鼠标位置*/publicvoidmoveTo(intx,inty){this.x=x-width/2;this.y=y-height/2;}/**越界处理*/@OverridepublicbooleanoutOfBounds(){returnfalse;}/**发射子弹*/publicBullet[]shoot(){intxStep=width/4;//4半intyStep=20;//步if(doubleFire>0){//双倍火力Bullet[]bullets=newBullet[2];bullets[0]=newBullet(x+xStep,y-yStep);//y-yStep(子弹距飞机的位置)bullets[1]=newBullet(x+3*xStep,y-yStep);returnbullets;}else{//单倍火力Bullet[]bullets=newBullet[1];bullets[0]=newBullet(x+2*xStep,y-yStep);returnbullets;}}/**移动*/@Overridepublicvoidstep(){if(images.length>0){image=images[index++/10%images.length];//切换图片hero0,hero1}}/**碰撞算法*/publicbooleanhit(FlyingObjectother){intx1=other.x-this.width/2;//x坐标最小距离intx2=other.x+this.width/2+other.width;//x坐标最大距离inty1=other.y-this.height/2;//y坐标最小距离inty2=other.y+this.height/2+other.height;//y坐标最大距离intherox=this.x+this.width/2;//英雄机x坐标中心点距离intheroy=this.y+this.height/2;//英雄机y坐标中心点距离returnherox>x1&&herox<x2&&heroy>y1&&heroy<y2;//区间范围内为撞上了}}
关于“怎么用Java实现飞机大战”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。