文章目录

  • 一、基本介绍
  • 二、源码分析
  • 三、总结

一、基本介绍

首先,先想想要完成一个飞机大战,需要完成那些步骤呢?

①是不是需要有个界面去显示飞机和子弹之类的组件呢?

这个时候是不是需要去绘制一个界面类呢? 答案是必须的!!!

②既然画完了界面,那界面的上的飞机、子弹、敌机啥的是不是也需要创建一个类去绘制呢?答案也是必须的!!!

在绘制子弹和敌机的时候,需要去考虑敌机遇到子弹爆炸的场景,以及每击毁一架飞机,怎么算我的得分的情况,这些都是需要去考虑的。

通过飞机大战能够学到的知识点有:

①面向对象:其中包括了继承、实现接口以及封装;

②学会使用队列ArrayList进行存储;

③明白如何读取图片,然后将该图片放在窗体上;

④学会使用多线程。

二、源码分析

①先绘制飞机大战的界面类GameMain类。

package FlyV4B;import javax.swing.ImageIcon;
import javax.swing.JFrame;public class GameMain {//窗口的宽度和高度static int width = 600;static int height = 800;public static void main(String[] args) {//创建一个窗口的大小JFrame frame = new JFrame();//设置标题frame.setTitle("飞机大战");//设置窗口的大小frame.setSize(width, height);//关闭窗口关闭后JVM终止运行frame.setDefaultCloseOperation(3);//设置窗口居中frame.setLocationRelativeTo(null);//创建JPanel容器GamePanel panel = new GamePanel();//把JPanel添加到窗口中frame.add(panel);//添加鼠标监听器frame.addMouseMotionListener(panel);//设置可见frame.setVisible(true);//初始化容器panel.init();}
}

在界面类中添加鼠标移动监听器,目的是鼠标放到界面上或者按压界面时能够使得飞机进行移动。

②英雄机类–GamePanel类

package FlyV4B;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.List;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;import javax.swing.ImageIcon;
import javax.swing.JPanel;public class GamePanel extends JPanel implements MouseMotionListener{//读取英雄机的图片ImageIcon heroImage = new ImageIcon("image/hero.png");//定义一个集合来装所有的敌机ArrayList<Enemy> enemys = new ArrayList();//定义一个队列来装所有的子弹ArrayList<Bullet> bullets = new ArrayList();//定义一个集合来装爆炸的图片ArrayList<Bomb> bombs = new ArrayList();//英雄机的坐标int heroX = 300;int heroY = 400;private int number=0;//分数public GamePanel() {//创建10个敌人for(int i=0; i<10; i++){enemys.add(new Enemy());}}//鼠标按下去拖动时调用public void mouseDragged(MouseEvent e) {System.out.println("鼠标按下去时拖动时调用");int x = e.getX();//获取鼠标的xint y = e.getY();heroX = x-(heroImage.getIconWidth()/2); //把鼠标的x赋值给英雄机heroY = y-(heroImage.getIconHeight()/2);if(x+heroImage.getIconWidth() > GameMain.width) {heroX = GameMain.width - heroImage.getIconWidth() - 20; }if(y+heroImage.getIconHeight() > GameMain.height) {heroY = GameMain.height - heroImage.getIconHeight() - 20; }repaint();//x发生变化后需要重新绘制}//鼠标移动时调用public void mouseMoved(MouseEvent e) {System.out.println("鼠标放上去时调用");int x = e.getX();//获取鼠标的x值int y = e.getY();//获取鼠标的y值heroX = x-(heroImage.getIconWidth()/2); //把鼠标的x赋值给英雄机heroY = y-(heroImage.getIconHeight()/2);//把鼠标的y赋值给英雄机if(x+heroImage.getIconWidth() > GameMain.width) {heroX = GameMain.width - heroImage.getIconWidth() - 20; }if(y+heroImage.getIconHeight() > GameMain.height) {heroY = GameMain.height - heroImage.getIconHeight() - 20; }repaint();//x发生变化后需要重新绘制}//碰撞方法public boolean isHit(Enemy e, Bullet b) {//指定一个区域Rectangle rect = new Rectangle(e.getX(), e.getY(), e.getWidth(), e.getHeight());//表示(x,y)坐标空间中的位置的点Point p = new Point(b.getX()+b.getWidth()/2, b.getY()+b.getHeight());return rect.contains(p);}//重写paint方法,做绘制图片使用public void paint(Graphics g) {super.paint(g);g.setFont(new Font("", Color.RED.getRed(), 30));g.drawString("得分"+number, 20, 30);//1.绘制英雄机g.drawImage(heroImage.getImage(), heroX, heroY, null);//2.绘制敌机for(int i=0; i<enemys.size(); i++) {Enemy enemy = enemys.get(i);enemy.drawImage(g);//重新绘制}//3.绘制子弹for(int i=0; i<bullets.size(); i++) {Bullet bullet = bullets.get(i);bullet.drawImage(g);}//4.绘制爆炸图片for(int i=0; i<bombs.size(); i++) {Bomb bomb = bombs.get(i);bomb.drawImage(g);}}/** init这个方法做初始化方法使用* 创建一些组件(英雄机,子弹,敌人)* */public void init() {int flag = 0;while(true) {flag++;//每循环20次创建一个子弹if(flag % 15 == 0) {//创建一些子弹Bullet bullet = new Bullet(heroX+heroImage.getIconWidth()/2, heroY);//把子弹添加到集合中bullets.add(bullet);}//让敌机往下移动for(int i=0; i<enemys.size(); i++) {Enemy enemy = enemys.get(i);enemy.move();//改变敌机的y值//判断敌机的y值是否大于整个窗口的高度if(enemy.getY() > GameMain.height){//删除敌机enemys.remove(enemy);//再添加一个新的敌机enemys.add(new Enemy());}}//让子弹飞起来for(int i=0; i<bullets.size(); i++){Bullet tempBullet = bullets.get(i);tempBullet.move();}System.out.println("子弹数量:"+bullets.size());//删除越界的子弹for(int i = 0; i<bullets.size(); i++) {Bullet bullet = bullets.get(i);if(bullet.getY() < 0) {//y轴小于零说明越界了bullets.remove(bullet);}}//处理子弹碰撞到敌机的效果for(int i=0; i<enemys.size(); i++) {Enemy enemy = enemys.get(i);//敌机for(int j=0; j<bullets.size(); j++) {Bullet bullet = bullets.get(j);//得到子弹if(isHit(enemy, bullet)){//先删除敌机enemys.remove(enemy);//先删除击中的敌机enemys.add(new Enemy());//再添加一个新的敌机bullets.remove(bullet);//删除子弹//创建一个爆炸图片的对象Bomb bomb = new Bomb(enemy.getX(), enemy.getY());bombs.add(bomb);//添加到集合中number+=10;//每次碰撞加10分}}}//删除爆炸的图片for(int i=0; i<bombs.size(); i++) {Bomb bomb = bombs.get(i);bomb.move();if(bomb.getCount()>5) {bombs.remove(bomb);}}try {Thread.sleep(5);} catch (Exception e) {e.printStackTrace();}repaint();}        }
}

③敌机类–Enemy类

package FlyV4B;import java.awt.Graphics;
import java.util.Random;import javax.swing.ImageIcon;/** 敌人对象* * */
public class Enemy {private int width;//敌人图片的宽度private int height;//敌人图片的高度//敌人的坐标private int x;private int y;//private ImageIcon  enemyImageIcon = new ImageIcon("image/enemy.png");public Enemy() {this.width = enemyImageIcon.getIconWidth();this.height = enemyImageIcon.getIconHeight();//设置敌机的位置Random random = new Random();random.nextInt(10);this.x = random.nextInt(GameMain.width - (width/2));this.y = -random.nextInt(GameMain.height - (height/2));}public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public void move() {this.y += 1; //速度}public void drawImage(Graphics g){g.drawImage(enemyImageIcon.getImage(), x, y, null);}
}

④子弹类–Bullet类

package FlyV4B;import java.awt.Graphics;import javax.swing.ImageIcon;/** 子弹对象* */public class Bullet {private int x;private int y;private int width;private int height;private ImageIcon bulletImageIcon = new ImageIcon("image/bullet.png");public Bullet(int x, int y) {this.x = x;this.y = y;this.width = bulletImageIcon.getIconWidth();this.height = bulletImageIcon.getIconHeight();}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public ImageIcon getBulletImageIcon() {return bulletImageIcon;}public void setBulletImageIcon(ImageIcon bulletImageIcon) {this.bulletImageIcon = bulletImageIcon;}public void move() {this.y -= 4;}public void drawImage(Graphics g) {g.drawImage(bulletImageIcon.getImage(), x, y, null);}
}

⑤爆炸图效果类–Bomb类

package FlyV4B;import java.awt.Graphics;import javax.swing.ImageIcon;public class Bomb {private int x;private int y;private int width;private int height;private ImageIcon bombimg = new ImageIcon("image/bomb.png");private int count;//删除的次数public int getCount() {return count;}public void setCount(int count) {this.count = count;}public Bomb(int x, int y) {this.x = x;this.y = y;this.width = bombimg.getIconWidth();this.height = bombimg.getIconHeight();}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public ImageIcon getBombimg() {return bombimg;}public void setBombimg(ImageIcon bombimg) {this.bombimg = bombimg;}public void drawImage(Graphics g) {g.drawImage(bombimg.getImage(), x, y, null);     }public void move() {count++;}
}

三、总结

通过上述的五个类,就能够画出接下来这样的飞机大战的效果,如下图:

附件:飞机源码+图片(亲测有效)密码: f909

Java编写飞机大战(超级详细的完整版)--附源码及图片相关推荐

  1. QT界面免费版开源图片转文字工具程序完整版附源码

    QT界面免费版开源图片转文字工具程序完整版附源码 需求源码的朋友请留言 操作步骤如下:

  2. 老男孩python 2018最新_2018最新老男孩全栈python第3期视频教程 完整版 附源码与笔记 | 52download...

    课程介绍: 一.Linux基础课程 深入浅出的带你全面认识互联网的基础构成,包括最重要的组成部分,计算机硬件和企业最常用的操作系统.让你知道信息在互联网上是如何传递的,企业应该如何管理计算机和操作系统 ...

  3. java毕业设计飞机航班信息查询系统演示视频2021源码+系统+数据库+lw文档+调试运行

    java毕业设计飞机航班信息查询系统演示视频2021源码+系统+数据库+lw文档+调试运行 注意:该项目只展示部分功能,如需了解,文末获取源码地址. 临近学期结束,还是毕业设计,你还在做java程序. ...

  4. Java毕设项目大学生校园兼职系统计算机(附源码+系统+数据库+LW)

    Java毕设项目大学生校园兼职系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ E ...

  5. JAVA计算机毕业设计社区生鲜电商平台(附源码、数据库)

    JAVA计算机毕业设计社区生鲜电商平台(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe( ...

  6. java计算机毕业设计Web网上购书后台管理系统(附源码、数据库)

    java计算机毕业设计Web网上购书后台管理系统(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecl ...

  7. Java毕设项目超市会员积分管理系统计算机(附源码+系统+数据库+LW)

    Java毕设项目超市会员积分管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...

  8. java计算机毕业设计ssm学生宿舍管理系统15pjb(附源码、数据库)

    java计算机毕业设计ssm学生宿舍管理系统15pjb(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...

  9. Java毕设项目保险公司风险测评管理系统计算机(附源码+系统+数据库+LW)

    Java毕设项目保险公司风险测评管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行) ...

  10. JAVA计算机毕业设计跨境电商网站(附源码、数据库)

    JAVA计算机毕业设计跨境电商网站(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(In ...

最新文章

  1. K8S 1.9.0二进制包部署(五)
  2. Interview:算法岗位面试—10.17早上—上海某科技公司算法岗位(偏算法,独角兽)非技术面试之比赛项目讲解和项目意义的探讨
  3. 提高电脑反应速度_宁美千元价电脑,一体机设计+21英寸屏,办公娱乐选它
  4. 如何创建Oracle DBLink
  5. 光纤收发器和光电转换器有什么区别?
  6. JavaBean、bean、POJO
  7. python电脑怎么打开任务管理器_利用Python调用Windows API,实现任务管理器功能
  8. centos 6 apt.sw.be 错误 无法yum安装软件解决方案
  9. stm32车牌识别_道路千万条,方案这一条,带你深入了解车牌号识别系统
  10. 浅析人脸识别算法及其应用
  11. Flutter使用fluwx实现微信分享
  12. 【prcc2017实践】win7工具安装python3.7、you-get、QuickTime、ffmpeg、prcc2017
  13. 杀毒奇招:用安全网关消灭蠕虫病毒(转)
  14. 目标函数(object function),损失函数(loss function)以及代价函数(cost function)之间的关系与区别
  15. getPhoneNumber:fail no permission
  16. Alientek SMT32开发板 跑马灯实验
  17. 华南理工广州学院 计算机专业,华南理工大学广州学院学子在“中国高校计算机...
  18. 使用Sandcastle 基于代码注释生成接口文档
  19. “聚生网管”应用常见问题汇总
  20. C语言结构体的存储空间分配

热门文章

  1. R语言软件和RStudio环境的下载与安装
  2. ALtium 16等长布线、差分布线
  3. LPC2478时钟模块详解
  4. 第五章 Spark-SQL进阶(一)之Dataset用法
  5. 如何使用离线网站,打开离线网站
  6. matlab文件编辑器,matlab写出两种打开M文件编辑器的方法
  7. 2018年通信工程师中级传输与接入无线专业实务真题
  8. 创建数据库常用SQL语句
  9. JAVA常见设计模式面试题
  10. node使用ffmpeg拼接音频