飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机)、敌人。而敌人应该分为打死给分的飞机(就是普通飞机),另一种就是打死有奖励的敌人。他们都应该是飞行物的子类,我们也可以为普通飞机和给奖励的敌人设一个接口让他们去实现接口,这样有利于以后的扩展,我在这里给的简化版的飞机大战,主要是为了让大家了解面向对象。
package fly; import gema.BallPanel; import gema.Brick; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Arrays; import java.util.Random; import java.util.Timer; import java.util.TimerTask; public class ShootGame extends JPanel { public static final int WIDTH=500; public static final int HEIGTH=754; public static BufferedImage background;//背景图片 public static BufferedImage airplane;//敌机 public static BufferedImage bee;//小蜜蜂 public static BufferedImage bullet;//子弹 public static BufferedImage gameover;//游戏结束 public static BufferedImage hero0;//英雄战机0 public static BufferedImage hero1;//英雄战机1 public static BufferedImage pause;//暂停 public static BufferedImage start;//开始 public static BufferedImage boss1;//背景图片 public static BufferedImage boss2;//背景图片 private Hero hero=new Hero();//创建一个战机对象 private static final int START=0;//游戏开始的状态 private static final int RUNNING=1;//游戏运行的状态 private static final int PAUSE=2;//游戏暂停的状态 private static final int GAME_OVER=3;//游戏结束的状态 private int state=0; private Bullet[] bullets={};//创建一个存储所有子弹的数组 private Timer timer;//定时器 private FlyingObject[] flyings={};//创建一个存储敌机的数组 private FlyingObject[] boss={};//创建一个存储boss1机的数组 private int score=0; static { try { background= ImageIO.read(ShootGame.class.getResource("background.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")); gameover= ImageIO.read(ShootGame.class.getResource("gameover.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")); start= ImageIO.read(ShootGame.class.getResource("start.png")); boss1= ImageIO.read(ShootGame.class.getResource("boss1.png")); boss2= ImageIO.read(ShootGame.class.getResource("boss2.png")); } catch (IOException e) { e.printStackTrace(); } } //画战机 public void pintHero(Graphics g){ g.drawImage(hero.getImage(),hero.getX(),hero.getY(),null); } //画游戏状态的方法 public void pintStage(Graphics g){ switch (state){ case START: g.drawImage(start,50,110,null); break; case PAUSE: g.drawImage(pause,0,0,null); break; case GAME_OVER: g.drawImage(gameover,0,0,null); break; } } //画子弹的方法 public void paibtBullets(Graphics g){ for (int i=0;i<bullets.length;i ){ Bullet b=bullets[i]; g.drawImage(b.getImage(),b.getX()-b.getWidth()/2,b.getY(),null); } } //画敌机 public void pintFlyingObjects(Graphics g){ for (int i=0;i<flyings.length;i ){ FlyingObject f=flyings[i]; g.drawImage(f.getImage(),f.getX(),f.getY(),null); } } //画分数和生命的方法 public void pintScore(Graphics g){ int x=10; int y=25; Font font=new Font(Font.SANS_SERIF,Font.BOLD,14); g.setFont(font); g.drawString("分数:" score,x,y); y =20; g.drawString("生命:" hero.getLife(),x,y); } @Override public void paint(Graphics g) { super.paint(g); g.drawImage(background,0,0,null); //调用画战机的方法 pintHero(g); //调用游戏状态的方法 pintStage(g); //调用画子弹的方法 paibtBullets(g); //调用画敌机的方法 pintFlyingObjects(g); //调用画分数的方法 pintScore(g); } //发射子弹的方法 int shootInent=0; public void shootAction(){ if (shootInent %20==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); } } //所有子弹移动一步的方法 public void stepAction(){ //子弹移动 for (int i=0;i<bullets.length;i ){ bullets[i].step(); } //敌机移动 for (int i=0;i<flyings.length;i ){ flyings[i].step(); } } //产生一个飞行物的方法 public FlyingObject nextOne(){ Random r=new Random(); int type=r.nextInt(5); if (type==0){ return new Bee(); }else { return new Airplane(); } } //产生敌机 int fylIndex=0; public void enterAction(){ if (fylIndex %20==0){ //产生一个敌机 FlyingObject obj=nextOne(); //扩容 flyings=Arrays.copyOf(flyings,flyings.length 1); //添加敌机 flyings[flyings.length-1]=obj; } } //产生一个boss1的方法 //检测一颗子弹是否和所有飞行物碰撞 public void bang(Bullet bullet){ int index=-1;//击中飞行物的索引 for (int i=0;i<flyings.length;i ){ FlyingObject f=flyings[i]; if (f.shootBy(bullet)){ index=i; break; } } //删除击中飞行物 if(index!=-1){ //记录被击中的敌机 FlyingObject one=flyings[index]; //被击中的飞行物的位置,重新放置最后一个元素 flyings[index]=flyings[flyings.length-1]; //删除最后一个元素 flyings=Arrays.copyOf(flyings,flyings.length-1); //判断飞行物的类型 if (one instanceof Enemy){ Enemy e=(Enemy)one;//强制转换 score =e.getScore();//加分 }else if (one instanceof Aword){ Aword a=(Aword)one; int type=a.getType();//获取奖励类型 switch (type){ case Aword.ADD_Fire: hero.setDoubleFire(2); break; case Aword.ADD_Life: hero.setLife(hero.getLife() 1); break; } } } } //所有的子弹是否和所有的飞行物发射碰撞 public void bangAction(){ for (int i=0;i<bullets.length;i ){ Bullet b=bullets[i]; bang(b); } } //检测游戏是否结束 public boolean isGameOver(){ for (int i=0;i<flyings.length;i ){ int index=-1; FlyingObject obj=flyings[i]; if (hero.hit(obj)){ hero.setLife(hero.getLife()-1);//减生命 index=i; } if (index!=-1){ //被碰到的飞行物的位置,重新放置最后一个元素 flyings[index]=flyings[flyings.length-1]; //删除最后一个元素 flyings=Arrays.copyOf(flyings,flyings.length-1); } } return hero.getLife()<=0; } //游戏结束改变游戏状态 public void checkGameOver(){ if (isGameOver()){ state=GAME_OVER; } } //删除越界的飞行物和子弹 public void outOfBoundsAction(){ int index=0; //创建一个数组用于装未出界的飞行物 FlyingObject[] flyingLives=new FlyingObject[flyings.length]; //将没有出界的飞行物放到flyingLives数组中 for (int i=0;i<flyings.length;i ){ FlyingObject f=flyings[i]; if (!f.outOfBounds()){ flyingLives[index]=f; index ; } } //将flyings数组重新赋值 flyings=Arrays.copyOf(flyingLives,index); index=0; //创建一个数组用于装未出界的飞行物 Bullet[] bulletLives=new Bullet[bullets.length]; //将没有出界的飞行物放到flyingLives数组中 for (int i=0;i<bullets.length;i ){ Bullet f=bullets[i]; if (!f.outOfBounds()){ bulletLives[index]=f; index ; } } //将flyings数组重新赋值 bullets=Arrays.copyOf(bulletLives,index); } //启动定时器的方法 public void action(){ //创建鼠标适配器 MouseAdapter ma=new MouseAdapter() { //鼠标滑动事件 public void mouseMoved(MouseEvent e){ if (state==RUNNING){ hero.setX(e.getX()-hero.getWidth()/2); hero.setY(e.getY()-hero.getHeigth()/2); } } //鼠标单击事件 public void mouseClicked(MouseEvent e){ if (state==START){ state=RUNNING; }else if (state==GAME_OVER){ hero=new Hero();//出现创建战斗机 score=0;//清空分数 flyings=new FlyingObject[0];//清空敌机 bullets=new Bullet[0];//清空子弹 state=START;//修改开始的状态 } } //鼠标移出 public void mouseExited(MouseEvent e){ if (state==RUNNING){ state=PAUSE; } } //鼠标进入 public void mouseEntered(MouseEvent e){ if (state==PAUSE){ state=RUNNING; } } }; //添加监听器 this.addMouseMotionListener(ma); this.addMouseListener(ma); timer=new Timer();//初始化定时器 timer.schedule(new TimerTask() { @Override public void run() { if (state==RUNNING){ shootAction();//调用发射的方法 stepAction();//调用子弹移动的方法 hero.step();//调用战机移动的方法 enterAction();//调用产生敌机的方法 bangAction();//调用飞行物和子弹碰撞的方法 checkGameOver();//调用游戏结束的方法 outOfBoundsAction();//检测飞行物是否越界的方法 } // System.out.println(bullets.length); //重绘 repaint(); } },10,10); } public static void main(String[] args) { JFrame frame=new JFrame("飞机大战"); frame.setSize(WIDTH,HEIGTH); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setAlwaysOnTop(true);//设置窗口总在前方 frame.setVisible(true); ShootGame sg=new ShootGame();//创建面板对象 frame.add(sg);//添加面板到窗体中 sg.action();//启动执行定时器 }}
评论