放假写的一个Java端打飞机小游戏。

复习到的知识点有:java图形界面,多线程,集合框架等。

主要的收获是知道了处理图层的方式,即JLayeredPane层次面板,主要思路

如下:

1.        创建一个JLayeredPanel对象实例layeredPane,声明大小

2.        将背景图片的JPanel 放到图层layeredPane最底层

3.        将飞机,子弹的JPanel放到背景图片之上的图层

4.        调用JFrame的setLayeredPane()方法加入图层面板

可改进方向:

1.排行榜

2.计时计分系统

3.敌机子弹

= =感觉都有思路了就没搞了2333

游戏截图:

游戏实现类(含注释):

public class GameFrame extends JFrame implements KeyListener {// 我的飞机private MyPlane myplane = null;//控制子弹线程private boolean flagBullet = true;//控制敌方飞机线程private boolean flagPlane = true;// 创建一个JLayeredPane用于分层的。JLayeredPane layeredPane;// 创建一个Panel和一个Label用于存放图片,作为背景。JPanel backgroundJp;JLabel backgroundJLabel;ImageIcon image;public static GameFrame game;//子弹作业ArrayList<Bullet> bullets ;private static int x;private static int y;public GameFrame() {game = this;//实例化子弹队列bullets = new ArrayList<>();myplane = new MyPlane();myplane.setLocation(633, 550);//创建一个用来分层的layeredPane = new JLayeredPane();image = new ImageIcon("images/background2.jpg");// 随便找一张图就可以看到效果。// 创建背景的那些东西backgroundJp = new JPanel();backgroundJp.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());backgroundJLabel = new JLabel(image);backgroundJp.add(backgroundJLabel);// 将jp放到最底层。layeredPane.add(backgroundJp, JLayeredPane.DEFAULT_LAYER);// 将jb放到高一层的地方layeredPane.add(myplane, JLayeredPane.MODAL_LAYER);this.setLayeredPane(layeredPane);this.setBounds(33,  0, 1300, 700);  this.addKeyListener(this);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//图标this.setIconImage(new ImageIcon("images/bfire.png").getImage());//不可放大或缩小this.setResizable(false);this.setVisible(true);//子弹线程launch();// 敌机线程otherPlane();}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {//获得飞机位置if (myplane!= null) {x = myplane.getX();y = myplane.getY();}//每次移动大小int speed = 20;//根据不同指令执行命令if (e.getKeyChar() == 'W' || e.getKeyChar() == 'w') { // 上移y -= speed;} else if (e.getKeyChar() == 'S' || e.getKeyChar() == 's') { // 下移y += speed;} else if (e.getKeyChar() == 'A' || e.getKeyChar() == 'a') { // 左移x -= speed;} else if (e.getKeyChar() == 'D' || e.getKeyChar() == 'd') { // 右移x += speed;}//设置活动范围if (x > -5 && x < Constant.windowx*2 - 165 && y > 0&& y < Constant.windowy*2 - 175) {if (myplane!=null) {myplane.setLocation(x, y);}}// repaint();}@Overridepublic void keyReleased(KeyEvent e) {}// 开启子弹线程private void launch() {new Thread() {@Overridepublic void run() {//如果为true,则启动线程,否则关闭while (flagBullet) {// 给出现时的坐标加上一个值,调整位置//以飞机坐标为参数,生成一个子弹对象Bullet bullet = new Bullet(myplane.getX() + 52,myplane.getY() + 30, game);// 将子弹加入面板layeredPane.add(bullet, JLayeredPane.MODAL_LAYER);// 添加进子弹列表GameList.bulletList.add(bullet);/*// 开始行动弄个子弹队列然后开个线程遍历队列然后每个子弹的x 和 y都相加 每次重设每个子弹的位置bullets.add(bullet);for (int i = 0; i < bullets.size(); i++) {int by = bullets.get(i).getY();int bx = bullets.get(i).getX();System.out.println("第"+i+"个子弹" + x +"and" + y);bullets.get(i).setY(by-60);bullets.get(i).setLocation(bx, by);//判断这颗子弹是否打到某个敌机GameList.intersectsBullet(bullets.get(i),game);// 将子弹加入面板layeredPane.add(bullet, JLayeredPane.POPUP_LAYER);// 如果出了界面,就跳出循环,不再执行if (by < 0) {//该颗子弹已出了可见面板,从面板中移除,跳出循环layeredPane.remove(bullet);//将子弹从列表中移除GameList.bulletList.remove(this);break;}}*/new Thread(bullet).start();// 每隔500毫秒发射一颗子弹try {Thread.sleep(300);} catch (Exception e) {e.printStackTrace();}}}}.start();}/** 启动敌机线程*/private void otherPlane() {new Thread() {@Overridepublic void run() {//获得第一次出现敌机的时间long firstTime = System.currentTimeMillis();//一次最多存在number数量的敌机int number = 5;while (flagPlane) {//获得当前时间long currentTime = System.currentTimeMillis();//每10秒多增加一架可以在界面上显示的敌机if(currentTime - firstTime > 10000){number ++;//交换数据firstTime = currentTime;}int size = GameList.planeList.size();//如果list中的敌机数量小于总共可以在界面上显示的,则创建对象if (size <= number) {OtherPlane otherPlane = new OtherPlane(GameFrame.this);//需要把该对象放到面板中去显示layeredPane.add(otherPlane, JLayeredPane.MODAL_LAYER);//加入listGameList.planeList.add(otherPlane);//启动,可以活动new Thread(otherPlane).start();//没500毫秒生成一个try {Thread.sleep(500);} catch (Exception e) {e.printStackTrace();}}}}}.start();}// 返回MyPlane对象public MyPlane getMyPlane() {return myplane;}//将我方飞机的数据清除public void setMyPlane(MyPlane myplane){this.myplane = myplane;}// 将子弹或者敌机从面板移除public void remove(Component c) {layeredPane.remove(c);}//停止子弹线程public void setFlagBullet(boolean b) {this.flagBullet = b;}//停止敌机线程public void setFlagPlane(boolean b) {this.flagPlane = b;}}

项目压缩包:

Java版打飞机小游戏相关推荐

  1. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...

  2. 用JAVA写个飞机小游戏玩玩吧

    闲来无事写了个飞机小游戏. 设定很简单,子弹打到飞机就结束游戏. 实现步骤如下,有问题可以评论区讨论: 首先建立一个PlayGame项目和它之下的包: MyGameFrame(游戏实现)类: pack ...

  3. Java 开发打飞机小游戏(附完整源码)

    上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐.代码 ...

  4. Java版 猜数字小游戏

    猜数字小游戏是一定是大家学习C语言编程的第一个或者是前几个小小项目了吧,今天,我们使用Java进行猜数字小游戏的实现 有对猜数字小游戏的基本思想不清楚的可以看这篇博客,里面是用C语言进行的实现以及相关 ...

  5. 基于java制作一个飞机小游戏(学习心得)

    emmm,第一篇博客 用了这么久的csdn,都是在观摩大佬们发帖,一只小萌新瑟瑟发抖,不敢说话,甚 至连代码也不能完全读懂.假期在b站自学(可以说是复习)了java课程,尚学堂的 2018版.链接如下 ...

  6. 【C语言】进阶版_飞机小游戏

    目录 前言 一.代码重构 二.新式子弹代替激光 三.优化敌方战机 四.增加积分模块 五.更好的清屏功能 写在最后 前言 没有学习函数,以上功能都在main()中实现是有点痛苦的.在学了函数之后会模块化 ...

  7. JAVA版贪吃蛇小游戏

    这是一篇关于JAVA的贪吃蛇游戏,源代码的部分在下面正文中介绍,图片和音频的部分都放在百度云盘,需要的自行下载. 文章目录 开发环境 一.下载方法 二.运行效果展示 三.项目结构以及主程序入口 1.项 ...

  8. 【C语言】豪华版_飞机小游戏

    目录 前言 一.飞机显示与控制 二.发射子弹 三.击中敌机 四.多台敌机 五.发射散弹 写在最后 前言 这是飞机游戏的第三版,我们已经实现了基础版和进阶版的飞机游戏  ,但是存在的问题很明显:已经发射 ...

  9. java飞机_使用java写出飞机小游戏

    很多朋友会疑惑:"游戏项目,又不能拿到企业面试中,为什么要讲?" 这是一种太过于功利的想法.就像,我们说:"今天吃个馒头,又不是长高,为什么要吃呢?" 游戏项目 ...

最新文章

  1. 【从零学习OpenCV 4】Mat类介绍
  2. 强强联手!这所C9高校与西湖大学签约
  3. 51单片机的轮胎气压监测系统_SHT11传感器的温度、湿度采集系统,51单片机,Proteus仿真,C代码等...
  4. 微软移除Visual Studio 2015中的UML
  5. url采集器_Linux「第三节」-centos7.5部署数据采集器Telegraf
  6. 我10年来的学习和生活
  7. JeeWx 微信开发公开课(Jeewx-API 专题),今晚8点不见不散
  8. Redis持久化机制(RDB VS AOF)
  9. NFS配置及开机自动挂载
  10. idea 改变输出语句的颜色 工具类
  11. python循环怎么跳过开始循环,如果循环内部调用的函数执行时间太长,你怎么能跳过python中的循环迭代?...
  12. 转发表是什么鬼?怎么工作?
  13. Java去除使用富文本编辑器时自动生成的标签
  14. 基于暗通道先验的单幅图像去雾
  15. 用matlab实现灰色预测gm11模型,用MATLAB实现灰色预测GM11模型
  16. python画圣诞帽_用Python给头像加上圣诞帽,新手必学
  17. 苹果手机怎么设置专属铃声?看一遍就能学会的超简单教程
  18. 千里之遥看樱花,“东湖·樱园”元宇宙
  19. Java就业方向和自学提升方法总结黑马就业班资源分享
  20. 【opencv人脸识别1】从图片中检测人脸

热门文章

  1. Python中的质数运算(101到200)
  2. Leetcode SQL会员题【吐血总结~~】第三天
  3. 织梦 php MIP改造,织梦dedecms MIP改造图片img转img-mip处理方法
  4. 郑码输入法 编码规则简介 汉字分解
  5. 查找文本工具grep
  6. 电子电路课程设计——8位数字抢答器设计论文
  7. 淘宝运营思路彻底转变,从人货场到AIPL模型
  8. Redis之Centos6安装使用及Windows客户端工具(绿色免安装版)下载
  9. 算法设计与分析-----贪心法
  10. Java中将时间格式转化为yyyy-MM-dd HH:mm:ss