基本信息
源码名称:飞机大战小游戏源码(java版)
源码大小:0.63M
文件格式:.zip
开发语言:Java
更新时间:2019-09-23
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
package com.tarena.fly; import java.awt.Font; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; /***主程序**/ public class ShootGame extends JPanel{//窗口类JPanel,软件自带 public static final int WIDTH=525;//常量用大写//窗口的宽 public static final int HEIGHT=600;//窗口的高 /** 游戏的当前状态: START RUNNING PAUSE GAME_OVER */ private int state; 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; public static BufferedImage background;//背景图 public static BufferedImage start;//启动图 public static BufferedImage pause;//暂停图 public static BufferedImage gameover;//敌机图 public static BufferedImage bigAirplane;//敌机图 public static BufferedImage airplane;//小蜜蜂图 public static BufferedImage bee;//子弹图 public static BufferedImage hero0;//英雄机 public static BufferedImage hero1;//英雄机 public static BufferedImage bullet; private Hero hero=new Hero();//英雄机对象 private BigAirplane b =new BigAirplane(); private FlyingObject[] flyings={};//敌人 private Bullet[] bullets={};//子弹数组 private Bullet1[] bullets1={};//子弹数组 static{//初始化静态资源 图片 try{ background=ImageIO.read(ShootGame.class.getResource("background.png")); bigAirplane=ImageIO.read(ShootGame.class.getResource("bigAirplane.png")); start=ImageIO.read(ShootGame.class.getResource("start.png")); pause=ImageIO.read(ShootGame.class.getResource("pause.png")); gameover=ImageIO.read(ShootGame.class.getResource("gameover.png")); airplane=ImageIO.read(ShootGame.class.getResource("airplane.png")); bee=ImageIO.read(ShootGame.class.getResource("bee.png")); hero0=ImageIO.read(ShootGame.class.getResource("hero1.png")); hero1=ImageIO.read(ShootGame.class.getResource("hero0.png")); bullet=ImageIO.read(ShootGame.class.getResource("bullet.png")); }catch(Exception e){ e.printStackTrace(); } } private Timer timer;//定时器 private int intervel=10;//定时器的时间间隔(以毫秒为单位) /****随机生成敌人(敌机 小蜜蜂)***/ public static FlyingObject nextOne(){ Random rand=new Random(); int type=rand.nextInt(20); if(type==0){ return new Bee();//随机为0时返回蜜蜂 } if(type==1){ return new BigAirplane(); } else{ return new Airplane();//随机为1――――19时返回敌机 } } /***敌人入场**/ int fkyEnteredUbdex=0;//敌人入场的计数 public void enterAction(){//10毫秒走一次 fkyEnteredUbdex ;//10毫秒增1 if(fkyEnteredUbdex%40==0){//没400毫秒走一次(10*40) FlyingObject one=nextOne();//获取敌人随机对象 flyings=Arrays.copyOf(flyings,flyings.length 1);//扩容 flyings[flyings.length-1]=one;//存到最后一个元素 } } public void stepAction(){//10毫秒走一次 hero.step(); for(int i=0;i<flyings.length;i ){ flyings[i].step(); } for(int i=0;i<bullets.length;i ){ bullets[i].step(); } for(int i=0;i<bullets1.length;i ){ bullets1[i].step(); } } /** 画游戏状态 */ public void paintState(Graphics g) { switch (state) { case START: // 启动状态 g.drawImage(start, 60, 0, null); break; case PAUSE: // 暂停状态 g.drawImage(pause, 60, 0, null); break; case GAME_OVER: // 游戏终止状态 g.drawImage(gameover, 60, 0, null); break; } } int shootIndex=0; public void shootAction(){//10毫秒走一次 shootIndex ; if(shootIndex%20==0){//每300(10*30)毫秒走一次 Bullet[] bs=hero.shoot();//获取英雄机发射的子弹 bullets =Arrays.copyOf(bullets,bullets.length bs.length); System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length); } if(shootIndex%30==0){//每300(10*30)毫秒走一次 for(int i=0;i<flyings.length;i ){ Bullet1[] bs1=flyings[i].shoot1(); bullets1 =Arrays.copyOf(bullets1,bullets1.length bs1.length); System.arraycopy(bs1,0,bullets1,bullets1.length-bs1.length,bs1.length); } } } /***一个子弹与所有敌人撞****/ public void bangAction(){ for(int i=0;i<bullets.length;i ){ bang(bullets[i]);//一个子弹与所有敌人撞 } } /** 画分数 */ public void paintScore(Graphics g) { int x = 10; // x坐标 int y = 25; // y坐标 Font font = new Font(Font.SANS_SERIF, Font.BOLD, 22); // 字体 g.setColor(new Color(0xFF0000)); g.setFont(font); // 设置字体 g.drawString("SCORE:" score, x, y); // 画分数 y = 20; // y坐标增20 g.drawString("LIFE:" hero.getLife(), x, y); // 画命 } /** 检查游戏结束 */ public void checkGameOverAction() { if (isGameOver()) { state = GAME_OVER; // 改变状态 } } /** 检查游戏是否结束 */ public boolean isGameOver() { for (int i = 0; i < flyings.length; i ) { int index = -1; FlyingObject obj = flyings[i]; if (hero.hit(obj)) { // 检查英雄机与飞行物是否碰撞 hero.subtractLife(); // 减命 hero.setDoubleFire(0); // 双倍火力解除 index = i; // 记录碰上的飞行物索引 } if (index != -1) { FlyingObject t = flyings[index]; flyings[index] = flyings[flyings.length - 1]; flyings[flyings.length - 1] = t; // 碰上的与最后一个飞行物交换 flyings = Arrays.copyOf(flyings, flyings.length - 1); // 删除碰上的飞行物 } } return hero.getLife() <= 0; } private int score=0;//声明 /** 子弹和飞行物之间的碰撞检查 */ public void bang(Bullet bullet) { int index = -1; // 击中的飞行物索引 for (int i = 0; i < flyings.length; i ) { FlyingObject obj = flyings[i]; if (obj.shootBy(bullet)) { // 判断是否击中 index = i; // 记录被击中的飞行物的索引 break; } } if (index != -1) { // 有击中的飞行物 FlyingObject one = flyings[index]; // 记录被击中的飞行物 FlyingObject temp = flyings[index]; // 被击中的飞行物与最后一个飞行物交换 flyings[index] = flyings[flyings.length - 1]; flyings[flyings.length - 1] = temp; flyings = Arrays.copyOf(flyings, flyings.length - 1); // 删除最后一个飞行物(即被击中的) // 检查one的类型(敌人加分,奖励获取) if (one instanceof Enemy) { // 检查类型,是敌人,则加分 Enemy e = (Enemy) one; // 强制类型转换 score = e.getScore(); // 加分 } else if (one instanceof Award) { // 若为奖励,设置奖励 Award a = (Award) one; int type = a.getType(); // 获取奖励类型 switch (type) { case Award.DOUBLE_FIRE: hero.addDoubleFire(); // 设置双倍火力 break; case Award.LIFE: hero.addLife(); // 设置加命 break; } } } } /** 删除越界飞行物及子弹 */ public void outOfBoundsAction() { int index = 0; // 索引 FlyingObject[] flyingLives = new FlyingObject[flyings.length]; // 活着的飞行物 for (int i = 0; i < flyings.length; i ) { FlyingObject f = flyings[i]; if (!f.outOfBounds()) { flyingLives[index ] = f; // 不越界的留着 } } flyings = Arrays.copyOf(flyingLives, index); // 将不越界的飞行物都留着 index = 0; // 索引重置为0 Bullet[] bulletLives = new Bullet[bullets.length]; for (int i = 0; i < bullets.length; i ) { Bullet b = bullets[i]; if (!b.outOfBounds()) { bulletLives[index ] = b; } } bullets = Arrays.copyOf(bulletLives, index); // 将不越界的子弹留着 } /***启动执行***/ public void action(){ MouseAdapter l = new MouseAdapter(){ public void mouseMoved(MouseEvent e){// 鼠标移动 int x=e.getX(); int y=e.getY(); hero.moveTo(x,y); } public void mouseEntered(MouseEvent e) { // 鼠标进入 if (state == PAUSE) { // 暂停状态下运行 state = RUNNING; } } @Override public void mouseExited(MouseEvent e) { // 鼠标退出 if (state == RUNNING) { // 游戏未结束,则设置其为暂停 state = PAUSE; } } @Override public void mouseClicked(MouseEvent e) { // 鼠标点击 switch (state) { case START: state = RUNNING; // 启动状态下运行 break; case GAME_OVER: // 游戏结束,清理现场 flyings = new FlyingObject[0]; // 清空飞行物 bullets = new Bullet[0]; // 清空子弹 hero = new Hero(); // 重新创建英雄机 score = 0; // 清空成绩 state = START; // 状态设置为启动 break; } } }; this.addMouseListener(l);//处理鼠标操作事件 this.addMouseMotionListener(l);//处理鼠标滑动事件 timer=new Timer();//创建定时器的对象 timer.schedule(new TimerTask(){ public void run(){//定时干的事,10毫秒走一次 if(state==RUNNING){ enterAction();//敌人(敌机 小蜜蜂)10毫米走一次 stepAction();//移动步数 shootAction();//子弹入场(英雄机发射子弹) bangAction();//子弹与敌人碰撞 isGameOver();//英雄机碰撞判断 checkGameOverAction(); //检查游戏结束 outOfBoundsAction();//删除越界飞行物及子弹 } repaint();//重绘(调用paint方法) } },intervel,intervel);//时间间隔 } public void paint(Graphics g){ g.drawImage(background,0,0,null);//背景图与窗口重合 paintHero(g);//画英雄机对象 paintFlyingobjects(g);//画敌人 paintBullets(g);//画小蜜蜂 paintBullets1(g);//画小蜜蜂 paintScore(g);//画分和画命 paintState(g); // 画游戏状态 } public void paintHero(Graphics g){ g.drawImage(hero.image,hero.x,hero.y,null); } public void paintFlyingobjects(Graphics g){ for(int i=0;i<flyings.length;i ){ FlyingObject f=flyings[i]; g.drawImage(f.image,f.x,f.y,null); } } public void paintBullets(Graphics g){ for(int i=0;i<bullets.length;i ){ Bullet b=bullets[i]; g.drawImage(b.image,b.x,b.y,null); } } public void paintBullets1(Graphics g){ for(int i=0;i<bullets1.length;i ){ Bullet1 b=bullets1[i]; g.drawImage(b.image,b.x,b.y,null); } } public static void main(String[] args) { JFrame frame=new JFrame("FLY");//窗口对象 ShootGame game=new ShootGame();//面板 frame.add(game);//将面板添加到窗口之中 frame.setSize(WIDTH,HEIGHT);//设置窗口大小 frame.setAlwaysOnTop(true);//设置窗口一直在前面,居上 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认关闭操作――――关闭窗口时的操作 frame.setLocationRelativeTo(null);//设置相对位置为null,即居中 frame.setVisible(true);//1.设置窗口可见 2.尽快调用paint()方法 game.action();//启动执行 } }