放假写的一个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. 【C++】C++11 STL算法(十):使用STL实现排序算法
  2. 计算机网络基础 — 网络设备 — 以太交换机(Switch)
  3. 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
  4. Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler
  5. GO 语言编程 windows 环境搭建
  6. 一个特殊的内码转换处理对于XML格式的UTF-8
  7. 复制构造函数与析构函数
  8. jsp中把js变量赋给java变量,或者将java变量赋给js变量怎么做?
  9. Java反射之修改常量值
  10. 使用BarTender连接Excel打印标签
  11. 通俗易懂的虚短、虚断的使用条件?
  12. HBuilderX 快捷键
  13. 【gloomyfish】【原创】数据分析之 – 散点图
  14. Google Chrome 浏览器翻译失败解决办法
  15. 2020年中国水利行业发展状况及未来发展趋势分析[图]
  16. 2020年(农历庚子鼠年)春联大全(收藏必备)
  17. 小程序谷歌统计 Google Analytics
  18. Kitkat中对class core, class main, class late_start的简单分析
  19. 为何现在的程序员没工作动力,迷茫、中年危机普遍发生?
  20. mp3音频转换,合并方法?-QVE音频剪辑

热门文章

  1. python中.any() 和.all()的用法
  2. 【PPP-RTK技术研究进展与实验验证】
  3. Vue2创建404页面
  4. 自适应二次元可爱萝莉音乐404页面模板
  5. 爬取数据出现乱码的解决方法
  6. CentOS7.5平台下的vsftpd运维脚本(个人练习版)
  7. 电容到底能抗多大的静电
  8. Fuse.js模糊搜索引擎
  9. 虚拟现实VR遇上云计算 将是怎样的情缘
  10. 转载:跟我一起写 Makefile