在实现这个游戏之前,我们首先需要知道项目可能要用到哪些知识点:
重绘,线程,双缓冲,数据结构的应用

差不多是这大概有这些,如果不够的话我们再加。
首先,我们应该实现敌机下落,在这里大概思路和利用线程使小球下落差不多。不同的是,我在这里用到了三种敌机,分别为小、大、BOSS机三种。然后给予这三种敌机不同的下落规则(即速度、出现的时间、是否伴随子弹的发射等等)来给游戏适当的增加点难度。

以下是我的大概设计思路和下落规则,大家可以参考一下

1.飞机是在一开始的时候就出现的,先出现什么飞机?速度?什么位置出现?频率?先出小飞机,再出大飞机,当所有的大小飞机都消失以后出现BOSS机.小飞机的速度较快:8    大飞机的速度较慢:4  BOSS机的速度最慢:2频率:每隔1秒出现一架小飞机,每出现4架小飞机后出现一架大飞机,最后出现BOSS机.位置:在窗体的范围内,考虑到png图片的高度和宽度,所以出现的时候注意减去相应的高度和宽度.2.小飞机,大飞机,BOSS机需要使用不同的vector类来保存,取出的时候再使用一个vector类来保存(保存的时候应该
将三个vector类中原来的飞机移除).再将保存起来的飞机依次进行画出.当出现4架小飞机的时候就出现一架大飞机,当
小飞机和大飞机都出现完了以后,出现BOSS机.注意:大飞机和BOSS机的时候伴随着子弹的发出.3.子弹:子弹在大飞机和BOSS机出现的时候出现.且速度优于大飞机和BOSS机.因为小飞机没有子弹,在这里我们利用byte标记来区别于小飞机和其他两种飞机,另外也需要将子弹标记,以防止子弹生成子弹。4.使用两个线程:(1)一个线程用来实现将不同的vector向量取出的飞机(先将大小飞机取出以后,再取出BOSS机,每取一次小飞机的时候将count记一次数,当count==4的时候,取出一架大飞机.当小飞机和大飞机全部取完以后再取出BOSS机),并保存在一个统一的vector向量中.    (2)另一个线程用来实现画飞机和子弹并使其移动.5.效果图出现过于闪烁的情况可以利用双缓冲技术来减少闪烁。

以下是代码主类,主要生成窗体和敌机,并将敌机保存在不同的vector向量中。

public class BallMain {public Graphics g;public Vector<Ball> vector, minVector, maxVector, bossVector;public ImageIcon img;public static void main(String[] args) {BallMain bm = new BallMain();bm.init();}public void init() {JFrame frame = new JFrame();frame.setTitle("飞机大战");frame.setSize(800, 800);frame.setDefaultCloseOperation(3);frame.setLocationRelativeTo(null);frame.setBackground(Color.white);frame.setResizable(false); // 不允许改变窗体大小frame.setVisible(true);this.g = frame.getGraphics();minVector = new Vector<Ball>();maxVector = new Vector<Ball>();bossVector = new Vector<Ball>();vector = new Vector<Ball>();initPlane(frame);BallThread bt = new BallThread(vector, minVector, maxVector,bossVector, frame);bt.start();BallGraThread bll = new BallGraThread(vector, frame,frame.getGraphics());bll.start();}public void initPlane(JFrame frame) {Random rand = new Random();// 小飞机的生成for (int i = 0; i < 8; i++) {ImageIcon icon = new ImageIcon("plane/plane0.png");int r = icon.getIconWidth() / 2;int x = rand.nextInt(frame.getWidth() - icon.getIconWidth()) + r;int y = -icon.getIconHeight();int vy = 8;Ball b = new Ball(icon.getImage(), x, y, r, vy, (byte) 1);minVector.add(b);}// 大飞机的生成for (int i = 0; i < 2; i++) {ImageIcon icon = new ImageIcon("plane/plane1.png");int r = icon.getIconWidth() / 2;int x = rand.nextInt(frame.getWidth() - icon.getIconWidth()) + r;int y = -icon.getIconHeight();int vy = 4;Ball b = new Ball(icon.getImage(), x, y, r, vy, (byte) 2);maxVector.add(b);}// Boss机的生成ImageIcon icon = new ImageIcon("plane/plane2.png");int r = icon.getIconWidth() / 2;int x = rand.nextInt(frame.getWidth() - icon.getIconWidth()) + r;int y = -icon.getIconHeight();int vy = 2;Ball b = new Ball(icon.getImage(), x, y, r, vy, (byte) 3);bossVector.add(b);}
}

以下为飞机的下落规则:

public BallThread(Vector<Ball> vector, Vector<Ball> minVector,Vector<Ball> maxVector, Vector<Ball> bossVector, JFrame frame) {this.vector = vector;this.minVector = minVector;this.maxVector = maxVector;this.bossVector = bossVector;this.frame = frame;}public void run() {int count = 0;while (true) {if (minVector.size() > 0) {vector.add(minVector.remove(0));++count;if (count == 4) {if (maxVector.size() > 0) {vector.add(maxVector.remove(0));count = 0;}}}if (vector.size() == 0) {vector.add(bossVector.remove(0));break;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

利用双缓冲减少闪烁,画出飞机并擦除,使其不断更新位置:

public class BallGraThread extends Thread {public Vector<Ball> vector;public JFrame frame;public Graphics g;public BufferedImage image;public Graphics ig;public BallGraThread(Vector<Ball> vector, JFrame frame, Graphics g) {this.vector = vector;this.frame = frame;this.g = g;}public void run() {if (image == null) {//创建一个带透明色的BufferedImage对象image = new BufferedImage(frame.getWidth(), frame.getHeight(),BufferedImage.TYPE_INT_ARGB);//获取画笔对象.ig = image.getGraphics();}while (true) {//擦除.ig.setColor(frame.getContentPane().getBackground());ig.fillRect(0, 0, frame.getWidth(), frame.getHeight());for (int i = 0; i < vector.size(); i++) {Ball ball = vector.get(i);ball.draw(ig);ball.move(vector, frame, ig);}g.drawImage(image, 0, 0, frame);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}

子弹类,标记子弹来区分三种敌机,当飞机和子弹飞出窗体外后将其移除与vector:

public class Ball {public int x, y;public int flag = 1;public Color color;public Image img;public BulletThread ba;int r;int vy;byte type;Random random = new Random();public Ball(Image img, int x, int y, int r, int vy, byte type) {this.img = img;this.x = x;this.y = y;this.r = r;this.vy = vy;this.type = type;}public void move(Vector<Ball> vector, JFrame frame, Graphics g) {if (y >= 0 && flag == 1) {// 如果是大飞机或者BOSS机的话,就发射子弹.if (type == 2 || type == 3) {ba = new BulletThread(vector, this);ba.start();flag = 2;System.out.println(ba);}}if (y >= frame.getHeight()) {img = new ImageIcon("planne/bullet.png").getImage();g.drawImage(img, x, y, 2 * r, 2 * r, null);System.out.println(ba);if (type == 2 || type == 3)ba.stopFlag = false;vector.remove(this);}y = y + vy;}public void draw(Graphics g) {// 需要将ImageIcon转为Image类型的.g.drawImage(img, x, y, 2 * r, 2 * r, null);}}

画出子弹并添加于vector向量中,使其移动:

public class BulletThread extends Thread {public Vector<Ball> vector;public Ball ball;// 大飞机的数据来生成子弹public boolean stopFlag = true;public boolean pauseFlag = true;public BulletThread(Vector<Ball> vector, Ball ball) {this.vector = vector;this.ball = ball;}public void run() {while (stopFlag) {if (pauseFlag) {int x = ball.x + ball.r;int y = ball.y + 2 * ball.r;int r = 20;Image img = new ImageIcon("plane/bullet.png").getImage();int vy = ball.vy + 4;Ball bullet = new Ball(img, x, y, r, vy, (byte) 0);vector.add(bullet);}try {Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

以上差不多就是敌机的下落,其他的一些功能尚未完善,比如可以给敌机添加不同的血量再来增加难度,大家可以根据自己的发挥来写出属于自己的飞机大战游戏。

Java学习之路:简单的飞机大战游戏(敌机下落篇)相关推荐

  1. 用java写一个简单的飞机大战游戏

    制作一个简单的飞机大战 注意!!!!!,图片素材在我的资源里有. 下面代码排序,非先后顺序.请看清楚类名 Airplane类 package Flyplane;public class Airplan ...

  2. 简单制作飞机大战游戏。

    飞机大战(初级)(一) 因为最近有做这个的实训,每天一点点的学习.因为自己也是个初学者,希望自己所做的这些也能帮助简单学习java的朋友,这是第一次在这上面去分享这些,一方面希望自己能进步,能交更多的 ...

  3. JAVA学习之路-简单的城堡游戏(一)

    简单的文字城堡游戏(一) 最近在学习后台的一些功能,发现自己的基础不是很牢固,所以想写点小程序,巩固一下以前学的知识,融合一下. 之前在慕课上学的课程中就有一个这样的小程序,写一个简单的文字城堡游戏. ...

  4. 用C语言写一个简单的飞机大战游戏(用到easyx图形库)

    学习内容:1.背景的运动 2.飞机爆炸效果 3.透明贴图工具 目录 一.需要用到的头文件.全局变量和一些函数.结构体 二.数据初始化以及图片处理 三.主体 四.物体碰撞 五.游戏运行 六.透明贴图工具 ...

  5. 项目: 最简单的飞机大战游戏

    目录 一.项目描述和最终的成果展示 二.输出一个飞机模型. 三.实现控制飞机移动的功能 四.添加发射激光功能 五.添加靶子和分数统计功能 一.项目描述和最终的成果展示 项目描述: 显示出一个飞机,并可 ...

  6. 用Java编写飞机大战游戏

    飞机大战(Plane War)是一款非常受欢迎的小游戏,它通过增加玩家的难度和挑战性,促使玩家不断提高自己的操作能力和反应速度,并在升级过程中逐步拓展游戏世界的规模和内容.本文将介绍如何使用Java编 ...

  7. 项目: 用封装的方法实现飞机大战游戏

    目录 一.项目描述和最终的成果展示 二.用函数进行封装 三.新型的发射子弹功能 四.实现移动的敌机功能和更正屏幕闪烁,清除光标功能 五.订正一些BUG和完成一些美化 这是上一次的飞机大战游戏的项目.项 ...

  8. 基于Java的飞机大战游戏的设计与实现论文

    源码下载 http://www.byamd.xyz/hui-zong-1/ 摘 要 现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communicat ...

  9. 基于Java的飞机大战游戏的设计与实现(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 基于Java的飞机大战游戏的设计与实现 摘   要 现如今,随着智能手机的兴起与普及,加上4G( ...

最新文章

  1. 软件性能测试pdf,软件性能测试解析与优化.pdf
  2. 【正一专栏】欧冠小组赛第四轮综述——有钱就能风清扬
  3. F - Tickets (预处理)
  4. 【若依(ruoyi)】树表代码生成
  5. mcq 队列_MCQ | 软件生命周期模型
  6. 数据结构php语言,PHP语言做网页开发,会用到什么数据结构,算法?
  7. Mysql查询优化——中间表方法优化count()统计大数据量总数问题
  8. ORA-01830:日期格式图片在转换整个输入字符之前结束
  9. Linux系统内存管理实验报告,Linux 内存管理 综合实验报告.pdf
  10. ★LeetCode(1025)——除数博弈(JavaScript)
  11. Luogu P4161 [SCOI2009]游戏 数论+DP
  12. 专场介绍 | 第12届中国R会议(北京)生物信息专场
  13. 在钢筋混泥土的城市,打铁还需身体硬
  14. 数字化公安预审系统应用业务流程解析
  15. 了解下HTML5大前端是什么
  16. 【微信小程序】使出千手浮图—回滚式
  17. V型滤池类毕业论文文献包含哪些?
  18. vue3编写组件的几种方式
  19. java封装怎么写_java中封装怎么写
  20. 2019_ICML_Domain Agnostic Learning with Disentangled Representations

热门文章

  1. Nature:为什么免疫系统可产生多样性抗体和T细胞受体?
  2. 苏建林DGCNN模型代码详解
  3. Matlab验证码识别
  4. 微信公众号 多台服务器,在多台 Linux 服务器上搭建 Pulsar 集群
  5. 爱奇艺SOAR探索与实践
  6. ThinkPHP中IP地址定位,包括IP地址库文件
  7. c盘扩容提示簇被标记_技能+ | C盘空间满了怎么办?无需格式化、不用重装系统,教你如何轻松搞定扩容...
  8. linux搭建pptpd服务器,最简单的Linux系统上的pptpd服务器安装
  9. 「镁客·请讲」打造一台眼睛专属“跑步机”,鹰视菲诺是如何用AI拯救近视的?...
  10. 以潘金莲和西门公子为例讲述Java静态代理和动态代理