JAVA 实现《飞机大战-III》游戏
Posted 毅慎
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 实现《飞机大战-III》游戏相关的知识,希望对你有一定的参考价值。
前言
《飞机大战-III》是一款融合了街机、竞技等多种元素的经典射击手游。华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣。
游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。
主要需求
基于Java Swing,以飞机大战为原形,以抗日电视剧《亮剑》中的“李云龙”为主题,实现菜单、选关、难度、等级、技能等功能。
主要设计
①进入游戏后,请按下shift键(将键盘改为英文模式)
②技能为数字1(攻击)、2(治愈)、3(蓄气)
③数字4、5、6、7、8为创意音效,空格键为暂停
④使用1、2技能会消耗相应的技能蓝条,3技能消耗一定血量恢复一定蓝
⑤触碰游戏中随机出现的降落伞弹药可以回蓝
⑥触碰游戏中随机出现的闪光粒子可以随机更换1技能特效,且血量与蓝加2
⑦由鼠标控制角色位置,角色会自动发射相应等级的子弹
⑧每打败一个boss,角色升一级,子弹同行升级
⑨每过一关,角色血量和蓝自动增大并加满
⑩按下空格暂停游戏
本游戏该版本共三个关卡和三种难度,任君挑选
功能截图
游戏开始
选择战机
开始游戏
代码实现
游戏面板类,把各游戏对象集中绘制到此面板
public class GamePanel extends JFrame
// Keypoint 基本变量定义
Image offScreenImage = null; // 定义双缓存
int width = 1250, height = 725; // 窗口宽高
public static int state = 0; // Keypoint 游戏状态 0未开始 1运行 2暂停 3通关失败 4通关成功
public static int score = 0; // 游戏分数
public static int count = 1; // 游戏绘制次数(计时作用)
static int enemyFrequency = 30; // 敌机出现频率(不同关卡速率不同)
static int enemyShellFrequency = 40; // 敌机子弹出现频率(不同关卡速率不同)
static int planeShellFrequency = 20; // 战机子弹出现频率(不同关卡速率不同)
public static int enemyCount = 1; // 记录敌机敌机出现数量
static int bossAppear = 50; // 定义出现多少敌机后boss出现
public static boolean skill_release = false; // 判定技能是否已经释放
static boolean play_BOSS_sound = true; // 调控boss出场音效只播放一次
static boolean play_warn_sound = true; // 调控boss出场预警音效只播放一次
static boolean end = true; // 调控失败或胜利音效只播放一次
static boolean T = false; // 失败或胜利时按T退出游戏
public static boolean R = false; // 返回主界面
static boolean play = true; // 调控按纽二(点击播放,再点击暂停)
static boolean prearranged = true; // 动态效果预加载
public static boolean MAAppear = false; // 神兽出现
public static boolean MAExist = false; // 神兽存在否
public static boolean plane_create = false; // 飞机创建
// 难度
static int skillConsume = 2; // 2 5 10 用技能消耗蓝
static int skillRecovery = 100; // 100 150 999 回蓝速度
static int lifeRecovery = 50; // 50 90 500 回血速度
// Keypoint 元素实体定义
// 背景实体类
public GameObject backGroundObj = new BackGround(GameUtils.bgImg, 0, -1900, 2, this);
// 战机实体类
public GameObject planeObj = new Plane(GameUtils.planeImg, 600, 550, 70, 100, 0, this);
// boss实体类
public GameObject BOSSObj = null;
// 神兽实体类
public GameObject mAnimalsObj = null;
// Keypoint 按钮声明
JButton button1 = new JButton("开始游戏");
JButton button2 = new JButton("听听歌吧");
JButton button3 = new JButton("退出游戏");
JButton button4 = new JButton("选择难度\\\\关卡");
JButton button5 = new JButton("游戏说明");
JButton button6 = new JButton("选择战机");
JPanel frame = new JPanel(); // 按钮面板
// Keypoint 音效声明
Sound sound = new Sound(GameUtils.run_no1); // 背景音乐1(亮剑)
// Sound sound2 = new Sound(GameUtils.run_no2); // 开始按钮(开炮)
Sound sound3 = new Sound(GameUtils.run2_no1); // 第二关背景音乐(无人机群)
Sound sound4 = new Sound(GameUtils.basic_no5); // 背景音乐2(枪林弹雨)
public GamePanel()
// Keypoint 开始界面按钮
frame.setLayout(null);
Sound s = new Sound(GameUtils.basic_no9); // 按纽二切歌
button1.setIcon(new ImageIcon(GameUtils.button_start)); // 开始界面按钮一
button1.setBounds(530, 350, 245, 70);
frame.add(button1);
button1.addActionListener(e ->
if (!Popup.select) // 如果返回主界面没有选择关卡,默认初始化第一关
GamePanel.bossAppear = 50;
BOSS.number = 0;
GamePanel.play_BOSS_sound = true;
Plane.lock = false;
Plane.plane_level = 1;
state = 1;
s.stop();
sound.start();
sound.loop();
new Sound(GameUtils.run_no2).start();
);
button2.setIcon(new ImageIcon(GameUtils.button_selection_plane)); // 开始界面按钮二
button2.setBounds(530, 435, 245, 70);
frame.add(button2);
button2.addActionListener(e -> new Popup_SelectPlane());
button3.setIcon(new ImageIcon(GameUtils.button_selection)); // 开始界面按钮三
button3.setBounds(530, 520, 245, 70);
frame.add(button3);
button3.addActionListener(e -> new Popup());
button4.setIcon(new ImageIcon(GameUtils.button_exit)); // 开始界面按钮四
button4.setBounds(530, 605, 245, 70);
frame.add(button4);
button4.addActionListener(e -> System.exit(0));
button5.setIcon(new ImageIcon(GameUtils.button_explain)); // 开始界面按钮五
button5.setBounds(20, 20, 45, 45);
frame.add(button5);
button6.setIcon(new ImageIcon(GameUtils.button_select)); // 开始界面按钮二
button6.setBounds(20, 80, 45, 45);
frame.add(button6);
button6.addActionListener(e ->
if (play)
sound.stop();
s.start();
s.loop();
play = false;
else
s.stop();
sound.start();
play = true;
);
button1.addMouseListener(new MouseAdapter()
@Override
public void mouseEntered(MouseEvent e)
new Sound(GameUtils.basic_no10).start();
);
button2.addMouseListener(new MouseAdapter()
@Override
public void mouseEntered(MouseEvent e)
new Sound(GameUtils.basic_no10).start();
);
button3.addMouseListener(new MouseAdapter()
@Override
public void mouseEntered(MouseEvent e)
new Sound(GameUtils.basic_no10).start();
);
button4.addMouseListener(new MouseAdapter()
@Override
public void mouseEntered(MouseEvent e)
new Sound(GameUtils.basic_no10).start();
);
button5.addMouseListener(new MouseAdapter()
@Override
public void mouseEntered(MouseEvent e)
new Sound(GameUtils.basic_no11).start();
JOptionPane.showMessageDialog(null,
"亲爱的云龙战士,欢迎来到开炮大陆!!\\n" +
"-----------------------------------------------------2021-12-01-----------------------------------------------------\\n" +
"下面是操作说明:\\n" +
" ①进入游戏后,请按下shift键(将键盘改为英文模式)\\n" +
" ②技能为数字1(攻击)、2(治愈)、3(蓄气)\\n" +
" ③数字4、5、6、7、8为创意音效,空格键为暂停\\n" +
" ④使用1、2技能会消耗相应的技能蓝条,3技能消耗一定血量恢复一定蓝\\n" +
" ⑤触碰游戏中随机出现的降落伞弹药可以回蓝\\n" +
" ⑥触碰游戏中随机出现的闪光粒子可以随机更换1技能特效,且血量与蓝加2\\n" +
" ⑦由鼠标控制角色位置,角色会自动发射相应等级的子弹\\n" +
" ⑧每打败一个boss,角色升一级,子弹同行升级\\n" +
" ⑨每过一关,角色血量和蓝自动增大并加满\\n" +
" ⑩按下空格暂停游戏\\n" +
"本游戏该版本共三个关卡和三种难度,任君挑选\\n" +
"-----------------------------------------------------2021-12-07-----------------------------------------------------\\n" +
"更新:\\n" +
" ①在暂停、失败、胜利界面可以按’R‘返回主界面,按‘T’退出游戏\\n" +
" ②新增在暂停界面按‘O’进入商店\\n" +
" ③w s a d上下左右控制神兽移动\\n" +
"-----------------------------------------------------2021-12-08-----------------------------------------------------\\n" +
"更新:\\n" +
" ①敌机会根据战机的位置进行跟踪移动\\n" +
" ②修改部分技能效果\\n" +
"-----------------------------------------------------2021-12-11-----------------------------------------------------\\n" +
"更新:\\n" +
" ①新增初始菜单选择战机功能\\n" +
"-----------------------------------------------------2021-12-13-----------------------------------------------------\\n" +
" ①修复一些已知问题\\n" +
"-------------------------------------------------------------------------------------------------------------------------\\n" +
"\\n" +
"注意事项:\\n" +
" 如果在游戏中遇到任何问题,请关闭重启!!!\\n" +
"\\n" +
" Developer: 涛\\n", "※游戏说明", JOptionPane.PLAIN_MESSAGE);
);
button6.addMouseListener(new MouseAdapter()
@Override
public void mouseEntered(MouseEvent e)
new Sound(GameUtils.basic_no10).start();
);
if (prearranged)
Explode explodeObj = new Explode(1000, -1000);
GameUtils.explodeList.add(explodeObj);
GameUtils.removeList.add(explodeObj);
Explode2 explodeObj2 = new Explode2(1000, -500);
GameUtils.explodeList2.add(explodeObj2);
GameUtils.removeList.add(explodeObj2);
Explode3 explodeObj3 = new Explode3(1000, -200);
GameUtils.explodeList3.add(explodeObj3);
GameUtils.removeList.add(explodeObj3);
prearranged = false;
this.add(frame); // 把开始界面按钮添加进主面板
launch();
// Keypoint 启动
public void launch()
this.setFocusable(true);
this.setVisible(true);
this.setBounds(0, 0, width, height);
this.setTitle("云龙开炮4.0");
this.setIconImage(GameUtils.icon); // 程序图标
this.setResizable(false);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 将游戏对象添加到大集合
GameUtils.gameObjList.add(backGroundObj);
GameUtils.gameObjList.add(planeObj);
// 鼠标监听
this.addMouseListener(new MouseAdapter()
@Override
public void mouseClicked(MouseEvent e)
System.out.println("鼠标监听按下 ——> " + e.getButton());
if (e.getButton() == 3)
System.out.println("释放技能1"); // 释放技能(攻击)
Skill.release = true;
Skill.number = 1;
);
// Keypoint 键盘监听(暂停、释放技能)
this.addKeyListener(new KeyAdapter()
@Override
public void keyPressed(KeyEvent e)
super.keyPressed(e);
switch (e.getKeyCode())
case 32: // 空格暂停
switch (state)
//运行改为暂停
case 1:
System.out.println("游戏暂停");
state = 2;
sound.stop();
sound3.stop();
sound4.stop();
break;
//暂停改为运行
case 2:
System.out.println("继续游戏");
state = 1;
sound.start();
if (Plane.plane_level == 2)
sound3.start();
sound4.start();
break;
break;
case 49: // 1 释放技能(攻击)
if (Plane.plane_skill >= 5)
System.out.println("释放技能1(攻击)");
Skill.release = true;
Skill.number = 1;
break;
case 50: // 2 释放技能(治疗)
if (Plane.plane_skill >= 5)
System.out.println("释放技能2(治疗)");
Skill.release = true;
Skill.number = 2;
break;
case 51: // 3 蓄气
System.out.println("释放技能3(蓄气)");
Skill.release = true;
Skill.number = 3;
break;
case 52: // 4 音效
new Sound求一款飞机大战游戏(很经典)