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求一款飞机大战游戏(很经典)

Python飞机大战项目终篇(一步一步实现---最全笔记)

java开发飞机大战

javascript飞机大战-----001分析

[知了堂学习笔记]_纯JS制作《飞机大战》游戏_第1讲(实现思路与游戏界面的实现)

一文教你实现「飞机大战」里战机的控制逻辑