雷电飞机射击游戏 JAVA

一、程序概述

1.开发环境

开发程序的工具Eclipse是著名的跨平台的自由集成开发环境、一个开放源代码的、基于Java的课扩展开发平台。就其本身而言,它只是一个框架和一组服务,用与通过插件组件构建开发环境。Eclipse的本身只是一个框架平台,但是众多插件的支持是的它拥有其他功能相对固定的IDE软件很难具有的灵活性。Eclipse附带了一个标准的插件集,包括Java开发工具。

2.开发目的

掌握用Java实现面向对象程序设计 基本方法,熟练掌握Java程序开发环境的使用,完成一个应用程序的设计、编码、调试,了解程序设计过程,锻炼实际应用能力,为后续课程打下基础。回忆童年经典游戏,开发属于自己的游戏。

3.开发功能

本程序实现的主要功能有游戏主界面、游戏结束界面、飞机爆炸效果、子弹移动、飞机移动、生命、分数、背景地图移动、键盘监听、线程实现。

二、程序概要

1.程序流程图

2.类

整个程序共有12个类。PM.java用于存放程序所需的图片资源、Location.java用于确定图片标签等在窗口中的位置、Myplane.java用于描述我方飞机、Enemyplane.java用于描述敌机飞机、Mybullet.java用于描述我方飞机的子弹、Enemybullet.java用于描述敌方飞机的子弹、Break.java用于描述飞机爆炸效果、Life.java用于我方飞机生命的提示、Home.java用于描述欢迎页中的内容、Gameover.java用于描述结束页的内容、Content.java用于调用其他类中的属性和方法利用线程完整实现功能、Game.java包含main()函数用于运行程序。

3.函数功能关系

主类Game.java里面的main()是程序的入口;Home.java功能是实现欢迎页面窗口的布局包含Bcakground()实现背景的布局、Label()实现文字提示的布局、Keyborad()键盘监听方法回车实现跳转游戏界面;Content.java是游戏的主要面板,有Mapmove()实现游戏地图的移动效果、内部类中包括盘paint()绘制飞机、子弹、字符串等,run()用于启动线程,分了很多不同的方法用集合类实现飞机、子弹等移动,用KeyListener接口实现键盘的监听,玩家飞机类Myplane.java、敌机类Enemyplane.java、子弹类Mybullet.java、Enemybullet.java都是继承Location类然后重现方法实现确定每个类的位置,再加子类特有的方法实现移动等。Break.java爆炸类通过飞机、敌机、子弹坐标判断是否发生碰撞利用一张.gif的图片相对于飞机位置实现爆炸功能。

三、程序详细设计

1.关键代码分析

主类Game.java的main()中new Home()用构造方法进行实例化,Home类中构造方法Home()实现设置窗口大小、窗口的图标、背景、提示Label、键盘监听实现了一个界面的显示。

Home类继承了JFrame实现窗口标题重写、add()和remove()标签、addKeyListener(new KeyAdapter()实现键盘的监听,当按下Enter键if(key == KeyEvent.VK_ENTER)实现页面跳转游戏界面由Content()实现,requestFocus()和setFocusable(true)方法实现是否获得焦点,使键盘监控等在新游戏界面中实现。remove()移除组件label防止覆盖在游戏界面中。Background()函数和Label()函数实例化ImageIcon实现背景图片、标签的添加。

Content类继承Jpanel调用KeyListener接口,是整个游戏的主体代码。同样也有键盘键盘监听控制我方飞机。

利用paint(Graphics g)实现drawImaghe、drawString、draw方法将背景、飞机、子弹、爆炸效果、标签绘制在窗口中。

new Thread()实例化线程的构造方法,run()运行线程,设定线程时间为time每次加30毫秒,Thread.sleep(30)线程停30毫秒后进行重绘repaint();实现静态的页面在每次重绘的时候就像在移动。时间参数time也实现了敌机每次移动和自带发射时间。

Mapmove()利用两张背景图拼接实现地图的滚动

Addnewenemy1(long time,long score)、Addnewenemy2、Addnewenemy3、Addnewenemy4、Addnewenemy5、Addnewenemy6这6个方法根据当前分数实现加入不同的敌机,缩短敌机出现时间,增加难度。

当生命值小于0时new Gameover()绘制游戏结束图片覆盖在窗口上,同时实现在不关闭窗口的情况下可以重新开始游戏。键盘监听回车键并且判断生命值小于0才能生效让生命值、飞机位置、得分初始化。

2.疑难问题解决

刚开始拿到Java大作业题目的时候一心想的就是小时候玩的最多的雷电,知道它是有什么功能,感觉会相对其它题目更容易些,实际开始打算动手做的时候却无从下手,似乎需要实现的功能都是在课堂中没有接触到了。随着时间流逝,自己也对这个作业紧张起来,开始认真着手做。参考了Java游戏编程开发教程中的代码,有了一些思路。

从开始做GUI界面实现窗口到显示背景和飞机都很顺利的进行,当我想实现飞机移动的时候就遇到难题了,知道要用到线程,但是对线程的学习比较少不会用,在百度找了线程有关的demo,明白线程与repaint()一起用可以实现画面更新。

第一次使用键盘监听,没有键盘监听就无法移动飞机,想过通过鼠标移动或者键盘,最终决定使用键盘控制。查到java类库中有java.awt.event.KeyAdapter; java.awt.event.KeyEvent;要使用键盘监听编译器会提示加入三个方法分别是keyPressed(KeyEvent e)按键被按下事件、keyReleased(KeyEvent e)按键被弹起事件、keyTyped(KeyEvent e)有字符被输入事件。

基本实现我方飞机移动和敌方飞机随事件变化移动,在做背景的移动又碰壁了,会发生地图的重叠而使背景层一片混乱,本来想放弃这个实现的,在不断修改数据后发现,背景不发生重叠需要背景的高与每次移动背景的y坐标成整数倍的关系。

加入飞机子弹时发现无法实现从飞机的中央发射出子弹,而是满屏幕有规律的出现子弹,在经过不断尝试以后想到创建Location类确定窗口中每个组件的位置,获取飞机的x,y坐标,相对于飞机的x,y坐标和飞机的长宽算出子弹出现的位置完成功能。

实现子弹与飞机碰撞和飞机与飞机碰撞出现位置偏差通过计算相对位置不断更改数据把问题解决,但在实现飞机爆炸的时候一心想的就是利用gif图,课本提供的案例代码是将图片弄成数组,组成一个连续的爆炸,我无法理解如何实现,运用不到自己的代码中,我便使用gif实现爆炸效果,但是gif图在窗口中实现始终都在不会消失,如果我在代码后面再写remove()方法实现gif去除,但是代码执行是立刻的,爆炸效果就会消失,首先想到java有没有延时执行某行代码的方法,使用与sleep()以后整个窗口都会暂停并且爆炸也不会消失。最后转换思路将爆炸移除单独写了函数Breakremove(long time),算是实现了设置3秒后移除爆炸效果。

觉得打开程序就直接进入到游戏界面不太友好,便想加一个菜单界面,但在Content类实现的时候不管怎样都是直接进入到游戏中,后面转变思路新建类Home实现菜单界面,监听键盘后切换到游戏界面,主类main()不再直接new Content()而是new Home()实现运行程序不直接进游戏界面而是先进菜单界面,类似的方法实现了Gameover界面。

四、程序使用说明

运行程序后游戏进入菜单界面,根据提示按回车键进入游戏界面

利用键盘上下左右键控制飞机,躲避敌机的碰撞和子弹的碰撞,利用自己飞机的子弹消灭敌机在游戏中获得分数从而提升关卡的难度。当生命值为0的时候,游戏结束,如果继续玩则回车键开始新的游戏。

 

五、程序分析

1.优点

程序运行比较流畅,基本功能都已经实现,程序代码层次清晰,归类合理。模块化很明显,各个模块很明确需要实现的功能,代码也易读,并且做了很多的注释,这也是我往常完成课后小作业从没有这种习惯,但大作业的代码太多,让我体会到了注释的好处。各功能相互调用的比较好。

2.缺点

有部分功能例如飞机爆炸比较将就,缺少实现例如BOSS类还有音效等,UI界面没有进一步优化完善。

六、总结

在做大作业之前我已经学习了一个学期的Java,但在做的过程中还是遇到了种种难题是我在课堂中没有接触到了。一句话活到老学到了是真的,更多的是自己在课余时间学习。非常幸运能在星空让我接触到新的一门语言Swift。还有在我边学Java的时候有Swift面向对象的编程思路。加上自己网上百度的demo和自己查看API解决一系列的问题。也很意外自己从一开始无从下手到最后完成一个令自己比较满意的程序,有一种成就感。通过游戏的开发也让我对编程更有兴趣。一路做下来收获了很多课堂中学习不到的知识。任何一门语言光靠理论知识是远远不够的,只有自己动手实践,并理论结合实际才能达到很好的学习效果。

七、参考文献

Java程序设计与实践教程

Java游戏编程开发教程

百度

Github

CSDN

//源码在github哦

https://github.com/Hph1998/ThunderGame

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值