这篇文章主要介绍了Java实现飞机大战游戏,本文给大家分享完整源代码和效果图展示,对java飞机大战游戏实现代码感兴趣的朋友一起看看吧
飞机大战详细文档
文末有源代码,以及本游戏使用的所有素材,将plane2文件复制在src文件下可以直接运行。
实现效果:
结构设计
- 角色设计
- 飞行对象类 FlyObject
- 战机类
- 我的飞机 MyPlane
- 敌方飞机 EnemyPlane
- 子弹类
- 我的子弹 MyBullet
- 敌方子弹 EnemyBullet
- 道具类 Prop
- 加分,加血,升级
- 战机类
- 地图背景类 Background
- 玩家类 Player
- HP,得分
- 飞行对象类 FlyObject
- 线程类
- 绘制线程 DrawThread
- 移动线程 MoveThread
- 生成敌方飞机线程 EnemyPlaneThread
- 敌方飞机生成子弹线程 EnemyButtleThread
- 检测碰撞线程 TestCrashThread
- 界面类
- 主界面 GameUI
- 选择地图界面 SelectMapUI
- 监听器类 KListener
- 通过按压键盘改变我方飞机的速度
- 数据结构
- 我方战机(只有一个)
- 我方飞机子弹集合
- 敌方飞机集合
- 敌方子弹集合
- 道具集合
详细分析
Main界面类使用边框布局,给面板分三个区,如图所示
关键代码:
绘制背景地图
飞行道具类UML图
判断FlyObject对象是否碰撞
绘制线程: 如何让我们的游戏动起来
- 视频原理:我们在屏幕上看见的动态图像图像实际上由若干个静止图像构成,由于人眼有暂留特性,刚显示的图像在大脑中停留一段时间,若静态图像每
- 秒钟变化25幅,那么人的感觉屏幕上的图像是动的。
- 绘制时要把所有的飞行物都绘制一遍,所以我们需要在每一个飞行物被创建时,添加到相关的飞行物集合中。(为了方便传值,我们将集合设为静态变量)
- 我们的绘制线程,选择每30ms绘制一次,注意先画背景,然后再遍历飞行物集合画飞行物。
背景的绘制
要想绘制动态的背景,首先我们要先画一张静态的背景图,那么如何绘制一张静态的背景图呢?
获取包中的图片:
我们的地图是一张可以从上往下无缝滚动的图片,就像是这样的图
接下来,如何让画出连续的图片呢?
在绘制函数中,有一个函数可以完美实现我们的需求
比如说,我们的图片高度为712个像素点,我们在下一时刻,图片向下移动了m个像素点,那么我们就将这张图片的0 ~ 712-m 部分,绘制到游戏界面的m ~ 712部分,
再将712-m ~ 712 部分绘制到游戏界面的0 ~ m 部分;
接下来,我们就要确定 m 的值,这个就很简单了,在绘制线程中,定义一个整数变量m ,每次绘制完 m++ 就可以了。(个人建议m+=2比较舒服)
绘制线程:
我的飞机的绘制
使用的飞机素材图片:
飞机扇动翅膀的原理与视频的原理相同,不停更换图片,形成视觉暂留效果
敌方飞机,敌方子弹等飞行物的绘制原理与MyPlane相同,后面不在赘述。(为了简化开发流程,飞行物可以不”扇动翅膀“)
移动线程
- 我们已经给每个飞行对象设置了X轴移动速度和Y轴移动速度,所以每次移动的时候,我们只需要遍历所有的飞行对象,
- 然后逐个移动一个speedX 和 speedY 单位即可。
- 多久移动一次呢?和绘制线程的间隔时间相同就好了,我们都设为30ms.
- 当飞行物飞出屏幕时,将飞行物移出集合,减少计算机资源的消耗。
如何控制我的飞机移动?
- 当然是通过键盘的 ↑ ↓ ← → 来控制了,我们需要设置一个键盘监听器给game界面,
- 注意要先使用 game.requestFocus(); 获取焦点,键盘监听器才可以使用。
敌方飞机线程 : 如何生成敌方飞机呢?
每隔一段时间,在游戏面板的顶部,产生一个敌方飞机
敌方子弹线程 : 使每一个敌方飞机开火
我们为每一个敌方飞机创建一个生成子弹的线程,要确定子弹产生的具体位置,就要知道敌方飞机的位置,所以我们要传入一个敌方飞机对象给该线程。
检测碰撞线程 : 在子弹与敌机碰撞时,移除敌机
- 此时我们会遇到一个问题,就是在遍历时,move移动线程有可能将其中的一个飞行物移出集合,会出现IndexOutOfBoundsException异常
- ,我们只需要在两个线程使用飞行物集合时,加上synchronized关键字,即可解决。
- MoveThread 遍历我的子弹集合
TestCrashThread 检测我的子弹与敌方飞机碰撞
其他功能:显示玩家hp,掉落道具,得分,升级,更换地图
- 显示hp:每次检测到我的飞机与敌方飞机,敌方子弹碰撞,就减分。减到<=0时,游戏结束。
- 得分:子弹打到敌方飞机时,加分,并将当前分数通过绘制线程绘制在屏幕上。
- 掉落道具:敌机消失的时候,随机掉落一个道具,我的飞机碰到道具时,回血/加分/升级
- 升级:我的飞机初始为1级,最高为3级,等级改变时,使用switch 根据等级改变我的飞机的子弹发射方式。
- 更换地图: 使用一个新的窗体,设置几个单选按钮,选择时通过监听器,改变地图的控制变量,从而改变地图的绘制。
源码下载:
链接: https://pan.baidu.com/s/1ORdS-Ep0MNmVsslv9YFjiQ
提取码: hvz4
到此这篇关于Java实现飞机大战游戏 附完整源码的文章就介绍到这了,更多相关java飞机大战内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!