一:界面搭建

1.1: 窗口的搭建

1.1.1首先,创建 MyPanel 类,继承 JPanel, 这个为我们绘制界面的面板,游戏中呈现的一系列画面都要在这个类中进行。

1.1.2在类中重写 paint 方法,我们的图像都在这个方法中进行绘制。

1.1.3 创建 PlaneWar 类,继承 JFrame。内有主方法,这是我们程序的入口。书写 getGame 方法,来对窗口进行初始化。

1.2: 菜单栏的搭建

首先,搭建菜单栏需要创建一个JmenuBar 类,在菜单栏下创建 游戏 和 帮助 两个一级菜单,并设置字体。创建两个一级菜单的子菜单,加入到一级菜单中,将一级菜单添加到菜单栏,最后设置到窗口。

initMenu() 方法写在 PlaneWar 类中,在 getGame()方法中调用。

二:游戏基本内容构建

2.1 :游戏背景图的设置

这时我们这次使用的背景图。下面是添加方法。

在 MyPanel 类的构造器中初始化该图片。

我们所有的图片都需要在构造器中初始化才能够使用,不然会报空指针异常。

在 paint 方法中将该图片画出。,我们所有需要显示出来的东西都需要在 paint()方法中绘制出来才可以使用。 (g 是画笔)

2.2: 飞机的创建

2.2.1 :在该游戏中我们有两类飞机,分别是我们的飞机与敌人的飞机。两者有许多共同之处,将他们提取出来,创建父类 Plane。子类有 MyPlaneEnemyPlane。

2.2.2 :这里是飞机的公共部分。x,y 是飞机的坐标。isLive 代表飞机是否存活。blood 代表飞机的血量。(该属性与爆炸效果有关)。 公共方法主要是移动方法move ,和 碰撞方法 isCrash,以及一些get、set方法。

2.3: 创建我们的飞机

这时我选择的飞机图片,将该图片在MyPanel类的构造器中初始化,在paint方法中绘制出来.

注意,我们中的第二个,第三个参数为飞机的坐标,我们不要输入固定值(如果为了实验一下,可以随意输入值),这时为了以后飞位置更改后,新的飞机能够绘制在正确的位置。170 为飞机的宽,150 为飞机图片的高。

此时,我们完成的效果如下图所示(忽略掉子弹和敌机)。

2.4:让我们的飞机动起来

2.4.1:这里我采用的是鼠标监听,飞机跟随鼠标的移动而移动。

这个方法在MyPanel类中。

使用匿名类内部减少代码量,在MouseAdapter中重写mouseMoved方法,这里的变量e,可以看作是我们的鼠标。

2.4.2:首先我们要判断鼠标的位置,与我们飞机位置之间的关系。(当开始游戏时,只有将鼠标移动到飞机图片上,飞机才会跟随鼠标移动。),当我们的鼠标移动到飞机上后,经过myPlane中的特有方法 isOnPlane, 判断为真,这时myPlane中的特有属性 canMove 为真,这时,只要飞机对象不为空且飞机仍然存活,我们就会调用 move 方法,使飞机的坐标与鼠标的坐标相同。从而达到跟随鼠标移动的效果。

这两个方法在 MyPlane 类中.

2.4.3:完成这一步后,我们运行程序,发现我们的飞机任何动不了。这时因为我们没有完成画面的repaint(重绘),可以理解为界面的刷新。

下面是重绘方法,在MyPanel 内里创建一个成员内部类,实现Runnable接口,在里面书写线程,进行刷新。接着将这个线程在MyPanel的构造器中启动。

2.4.4: 这里展示的只是一种重绘方式。也可以直接让MyPanel实现Runnable接口,直接书写线程重绘,然后在PanelWar的getGame方法中进行线程的启动。等等~~

2.5 子弹的绘制以及发射

2.5.1 首先,我们应该想到,子弹射出后要持续改变坐标进行移动,所以我们要创建一个子弹类,来进行这个线程。我们的飞机从下向上射击,所以 y 的坐标应该不断减少,x 的坐标保持不变。同时含有Boolean类型属性 canShot 来控制线程的进行和终止。当 y 的坐标将要到达画面边界时,将线程终止,让子弹消失(消失具体体现在paint方法中)。

2.5.2: 只是我们飞机的子弹(不断发射的),所以我们的飞机类MyPlane中要有一个集合,来存储在界面上的子弹。(这里我使用的是Vector集合,线程安全)

2.5.3:同时,我们的飞机类需要实现Runnable 接口,因为我们的飞机需要源源不断的产生子弹。每 150 ms 就产生一颗子弹,加入到集合中,子弹的初始坐标为当前飞机图片机头坐标。加入完毕后,变量子弹集合,如果子弹不能射击(即到达边界),就将该子弹从集合中移除,否则就启动线程。同时设置守护线程(即飞机被摧毁的同时,所有的子弹也停止)。

2.5.4:在MyPanel 的构造器中初始化飞机,启动线程。(记得要在paint方法中通过遍历绘制出子弹。) 这时子弹图片。

2.5:敌人的飞机

这里敌人的飞机有3种不同的类型(即不同图片的飞机)。

同时,有线程来控制敌机的移动,从上到下竖直移动。(这里在遍历敌人子弹时会偶尔抛出异常,同时敌人发射子弹造成游戏难度太高,我把它注释掉了)

这是敌人子弹类,有兴趣的可以试一下。

接下来。我们在MyPanel中定义敌人飞机集合,在构造器中启动线程,不断产生新的敌机,并且启动飞机的移动线程(这里我使用的匿名内部类,减少代码量)。下图代码在MyPanel构造器中。最后在paint()方法中画出敌机即可。

三:游戏效果的增加

3.1 增加碰撞,摧毁机制

3.1.1: 在Plane类(父类中)书写方法isCrash,输入碰撞的坐标,和类型。这里碰撞分两种类型,一种是我们的子弹打到敌机,敌机摧毁。另外一种是我们的飞机与敌人的飞机碰撞,游戏结束。

 在MyPanel类中书写 crash,首先判断子弹与敌机碰撞情况,遍历所有的敌机和所有的子弹,传入子弹坐标(这时种类1的碰撞,传入1),如果碰撞为真,就将该子弹的canShot 和 敌机的 isLive 属性都为false,重绘后,在paint方法中移除。

接下来是飞机的碰撞情况,与上述基本相同。碰撞后,游戏结束,isPlay = false

最后在paint方法中加入crash()即可。

3.2  增加爆炸效果

boom 方法,在MyPanel 方法中。这里使用参数多态,我们的飞机和敌机都可以传入,通过blood的不断减少,放出不同的爆炸图片,形成动态效果。

最后在paint中调用该方法。

四:后续

我的代码到这里就结束了,大家写的还可以加入分数系统,以及IO流,预处理等来储存数据,以便继续上盘游戏,开始游戏,GameOver等功能。

最后效果静态图演示

《飞机大战小游戏(Java)》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. Orchard模块开发全接触3:分类的实现及内容呈现(Display)
  2. 引号快捷键_高效率的Excel-Ctrl类快捷键二
  3. OpenCV——素描
  4. Spring 核心特性
  5. 【双百解法】剑指 Offer 11. 旋转数组的最小数字
  6. 使用UltraEdit来拷贝粘贴二进制
  7. dft计算傅里叶级数系数_一道国外的DFT性质的题目
  8. 深度重建:基于深度学习的图像重建
  9. 如何设置jquery的ajax方法为同步
  10. Linux虚拟化KVM-Qemu分析(七)之timer虚拟化
  11. MySQL解析json字符串的相关问题
  12. UNet多类别分割的keras实现
  13. 用C++语言写游戏——打飞机
  14. VMware-KVM安装
  15. 电路与电子3.2.2PNP型三极管与恒流充电源
  16. 数据分析案例-对某宝用户评论做情感分析
  17. 2017年手机html5的发展,HTML5明年年中发展成熟 或带来行业洗牌
  18. html5调用视频代码,HTML 5 视频使用(示例代码)
  19. Apple Watch如何重新配对
  20. 电梯屏只有新潮的一半了!阿里的150亿,能否让分众扛住挑战?

热门文章

  1. Ubuntu18.04安装GNSS 处理软件 u-center
  2. 石墨烯在生物医学上应用的研究进展_多孔石墨烯的制备及应用
  3. 朗强:HDMI视频画面分割器基本工作原理和性能
  4. 深入剖析Spring Web源码(十九) - 整理的文档和日志的索引(第一版)
  5. HTML前端静态网页制作
  6. 一场疫情,全民变厨子、医生变战士、教师变主播、只有孩子们,依然是神兽!...
  7. 微博为何做绿洲?社交化、生活化和垂直化
  8. Linux搭建Steam饥荒服务器教程 — SteamCMD方式
  9. Petya勒索病毒爆发,腾讯安全反病毒实验室首发技术分析
  10. python混淆ios代码_XSDK——iOS代码混淆原理