前言
声明:该文章只是做技术分享,若侵权请联系我删除。!!
感谢大佬的视频:
https://www.bilibili.com/video/BV1JT4y1n7kD/?vd_source=5f425e0074a7f92921f53ab87712357b
源码:https://space.bilibili.com/565112134
使用技术:Java(JavaSE期末课程设计)
主要内容:用java实现飞机大战
主要内容
1、首页
主要功能:实现小时候玩的一个小游戏,飞机大战,玩家通过上、下、左、右。按键控制我放战斗机发射子弹,击毙敌机,敌机数量较多,需要躲避敌机的炮弹,将敌机击毙即可,上下左右按键均可控制战斗机的行动。敌机是速度较快,需要玩家灵活的控制战斗机,躲避敌机的同时,能够最大限度的击毙敌机,当玩家命中大boss且boss血量小于0时游戏胜利,当我方战斗机血量小于0时,游戏失败、结束。
2、系统流程图
3、需求分析
(1)飞机大战游戏需要用到java基础语法和一下基本库的使用。在对该游戏设计开发的时候,首先要有面向对象的思想,在java里面万物皆对象,在对图片进行处理时。只需要加载图片,使图片成为对象,对这个对象进行基本操作就可以完成相应功能
(2)框架搭建,在对游戏处理时,需要对游戏平台进行设计,即创建窗口和游戏面板,在游戏面板上进行对飞机、子弹等图片对象的基本操作。
(3)线程使用,在对飞机对象的操作时,涉及到飞机、子弹的运动,要使用线程模块将对象的运动进行简化和加工,这样可以减少内存的消耗。对图片的处理能力进行了 优化。
(4)对象控制,对象控制可以继承java的keyAapter类,该类可以读取键盘键值,通过if语句对相应按键进行对不同对象运行的处理,通过上下左右按键实现战斗机的上下左右移动。
(5)事件处理和优化,在敌机的运动中,敌机要随机参数运动位置,并且要对出了游戏面板后需要将敌机删除。当子弹和敌机碰撞后要将敌机移除。
(6)java基础,封装、继承:在代码编写时,类的继承尤其重要而且容易出错误,使用@overide该方法是继续过来或者实现的方法,如果加了该注解,它的父类或者实现的接口中没有该方法,则ide会报错。同时,在战斗机中,子弹类可以设置成内部类,变于对象的操作和实现。
(7)游戏面板。创建窗口后,飞机、子弹对象并不是直接添加的窗口对象,因为在游戏过程中,需要不断的更新画面,所以使用JPenl类创建了游戏面板。可以方便的在游戏面板上对图片进行操作,如图片的更新,移除。
(8)碰撞检测:当子弹和敌机或者敌机和玩家的战斗机发射碰撞时,需要做相应处理,使用getRect().intersets()方法很好的对图片对象进行碰撞判断。
4、功能模块设计
5、效果截图
关键代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class PlaneFrame extends JFrame{
PlanePanle jp;
//子弹队列
static List<Shell> list = new ArrayList<Shell>();
//boss队列
static List<Boss> bossList = new ArrayList<Boss>();
//敌方战机队列
static List<EnemyPlane> enemyList = new ArrayList<>();
//存放boss子弹对象
static ArrayList<Shell> bossBulletList=new ArrayList<Shell>();
//存放敌机子弹
static ArrayList<Shell> enemyShell = new ArrayList<Shell>();
static int enemyPlaneCount=0;//敌方的数目
static int enemyPlaneNumber=5; //设置敌人最大飞机数目
static int bossCount;//boss的数量
static int bossNumber=1;//boss的最大数量
public static String path=System.getProperty("user.dir")+"\\Resouce";
public static HashMap<String,BufferedImage> maps = new HashMap<>();
public void start() {
File[] file = new File(path).listFiles();
for(int i=0;i<file.length;i++) {
try {
maps.put(file[i].getName(), ImageIO.read(file[i]));
} catch (IOException e) {
e.printStackTrace();
}
}
}
public PlaneFrame() {
//设置窗口大小
this.setSize(640,700);
//设置窗口名称
this.setTitle("信工16级2班黄通作品--飞机游戏");
//居中
this.setLocationRelativeTo(null);
//设置不可改变大小
this.setResizable(false);
//关闭程序,释放资源
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//添加一个适配器
this.addKeyListener(new MyKeyListener());
//开始加载图片
start();
//添加面板
jp = new PlanePanle();
add(jp);
//设置窗口可见
setVisible(true);
}
//添加一个适配器
class MyKeyListener extends KeyAdapter{
public void keyPressed(KeyEvent e) {
jp.keyPressed(e);
}
}
public static void main(String[] args) {
new PlaneFrame();
}
}
总结
想要看具体效果的同学,可以访问这个链接:
https://www.bilibili.com/video/BV1JT4y1n7kD/?vd_source=5f425e0074a7f92921f53ab87712357b
具体的代码也在该链接下。