Java实现经典游戏飞机大战-I的示例代码

目录
  • 前言
  • 主要设计
  • 功能截图
  • 代码实现
    • 启动类
    • 核心类
    • 核心算法
  • 总结

前言

《飞机大战-I》是一款融合了街机、竞技等多种元素的经典射击手游。华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣。

游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。

主要需求

玩家控制一台战斗机,以消灭所有的敌机为胜利,有些敌机会掉落装备,不可错过哦

主要设计

1、 用Swing库做可视化界面

2、鼠标控制战斗机移动

3、 用线程实现画面刷新。

4、用流实现音乐播放。

5、 创造一个飞机, 并且放在场景下方。

6、管理场景所有的飞机、子弹、道具移动

7、管理场景所有的子弹的发射

8、生成敌方飞机算法

9、分数计算算法

功能截图

游戏开始

战斗效果:

代码实现

启动类

public class Main {

    public static void main(String[] args) {
        // 创建窗口
        JFrame frame = new JFrame("飞机大战");
        // 添加 JPanel
        Data.canvas = new Canvas(frame);
        frame.setContentPane(Data.canvas);
        // 初始化 Data
        Data.init();
        // 设置图标
        frame.setIconImage(Load.image("ICON.png"));
        // 设置窗口可见
        frame.setVisible(true);
        // 获取标题栏的高度和宽度
        Data.TITLE_BOX_HEIGHT = frame.getInsets().top;
        // 设置大小
        frame.setSize(Data.WIDTH, Data.HEIGHT + Data.TITLE_BOX_HEIGHT);
        // 窗口大小固定
        frame.setResizable(false);
        // 窗口居中显示
        frame.setLocationRelativeTo(frame.getOwner());
        // 窗口关闭时结束程序
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 播放背景音乐
        Load.sound("background").loop(Clip.LOOP_CONTINUOUSLY);
    }
}

核心类

public class Game implements Scenes {
    // 玩家 BOSS
    Aircraft player, boss;
    // 敌人
    List<Aircraft> enemy;
    // 玩家子弹 敌人子弹 道具列表
    List<Bullet> bulletPlayer, bulletEnemy, bulletBuff;
    // 玩家生命 生命 < 0 时死亡
    // int life = Data.LIFE;
    // 当前关卡 当前分数
    int checkpoint = 1, fraction = 0;
    // 飞机的飞行方向, 此处需要注意,监听按键来控制飞机移动时,不应该单纯的按键按下一次就执行一次,因为键盘按下不松开,飞机应该一直向某个方向移动,直到按键被放开
    boolean left = false, right = false, down = false, up = false;
    // fps, 记录当前帧数
    int fps = 0;
    // 提示的 x 坐标
    int tipsX = -1000;

    public Game() {
        // 创造一个飞机, 并且放在场景下方, 玩家的角度属性不会使用
        player = new Aircraft(Data.playerAircraftImage, Data.playerDeathImage, Data.SPEED, 0, Data.WIDTH / 2 - 40, Data.HEIGHT - 100);
        // 设置飞机碰撞点,因为游戏采用的矩形碰撞检测,会出现很多误差,所以手动设置碰撞矩形,不采用图片的大小, 这个碰撞的坐标是相对于图片位置的相对坐标
        player.upperLeft = new Point(15, 15);
        player.lowerRight = new Point(75, 75);
        // 初始化列表
        bulletPlayer = new ArrayList<>();
        bulletEnemy = new ArrayList<>();
        bulletBuff = new ArrayList<>();
        enemy = new ArrayList<>();
    }

    public void onKeyDown(int keyCode) {
        if (keyCode == KeyEvent.VK_W || keyCode == KeyEvent.VK_UP)
            up = true;
        if (keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_DOWN)
            down = true;
        if (keyCode == KeyEvent.VK_A || keyCode == KeyEvent.VK_LEFT)
            left = true;
        if (keyCode == KeyEvent.VK_D || keyCode == KeyEvent.VK_RIGHT)
            right = true;
    }

    public void onKeyUp(int keyCode) {
        if (keyCode == KeyEvent.VK_W || keyCode == KeyEvent.VK_UP)
            up = false;
        if (keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_DOWN)
            down = false;
        if (keyCode == KeyEvent.VK_A || keyCode == KeyEvent.VK_LEFT)
            left = false;
        if (keyCode == KeyEvent.VK_D || keyCode == KeyEvent.VK_RIGHT)
            right = false;
    }

    public void onMouse(int x, int y, int struts) {

    }

    public void draw(Graphics g) {
        if (fps == 0) {
            left = right = up = down = false;
        }
        // 绘制一次 fps + 1
        fps++;
        // 飞机移动
        move();
        // 子弹发射
        attack();
        // 敌方飞机生成
        generate();
        // 失效对象销毁
        remove();
        // 绘制背景
        Data.background.show(g);
        // 绘制我方飞机
        if(player != null)
            player.draw(g);
        // 绘制BOSS
        if (boss != null) boss.draw(g);
        // 绘制敌方飞机
        for (Aircraft a : enemy)
            a.draw(g);
        // 绘制我发子弹
        for (Bullet b : bulletPlayer)
            b.draw(g);
        // 绘制敌方子弹
        for (Bullet b : bulletEnemy)
            b.draw(g);
        // 绘制道具
        for (Bullet d : bulletBuff)
            d.draw(g);

        g.drawString("分数 : " + fraction, 200, 200);
        if (boss != null) {
            g.drawImage(Data.hpBox, 10, -10, null);
            g.setColor(Color.orange);
            g.fillRect(106, -2, (int) (300 * ((boss.hp * 1.0) / 300)), 15);
        }
        // 绘制boss出现的图片
        if (tipsX > -900 && tipsX < 900) {
            g.drawImage(Data.tips, tipsX, 200, null);
        }
    }

    // 管理场景所有的飞机、子弹、道具移动
    void move() {
        if (player != null) {
            // 这里这个坐标,是为了让敌人发射子弹时定位用的
            Data.x = player.x;
            Data.y = player.y;
            // 飞机向上移动, 这里还限制了飞机的范围,不让其飞出屏幕外
            if (up) player.move(0, -player.speed);
            if (player.y < 0) player.y = 0;
            // 飞机向下移动
            if (down) player.move(0, player.speed);
            if (player.y > Data.HEIGHT - player.height) player.y = Data.HEIGHT - player.height;
            // 飞机向左移动
            if (left) player.move(-player.speed, 0);
            if (player.x < 0) player.x = 0;
            // 飞机向右移动
            if (right) player.move(player.speed, 0);
            if (player.x > Data.WIDTH - player.width) player.x = Data.WIDTH - player.width;
        }
        // boss 移动
        if (boss != null) boss.move();
        // 我方子弹的移动
        for (Bullet bullet : bulletPlayer)
            bullet.move();
        // 敌方子弹的移动
        for (Bullet bullet : bulletEnemy)
            bullet.move();
        // 道具的移动
        for (Bullet bullet : bulletBuff)
            bullet.move();
        // 地方飞机的移动,包括BOSS
        for (Aircraft air : enemy)
            air.move();
        // BUFF 移动
        for (Bullet b : bulletBuff)
            b.move();
    }

    void remove() {
        Random random = new Random();
        // 子弹销毁
        for (int i = 0; i < bulletEnemy.size(); ) {
            if (bulletEnemy.get(i).isRemove()) {
                bulletEnemy.remove(i);
            } else i++;
        }
        for (int i = 0; i < bulletPlayer.size(); ) {
            if (bulletPlayer.get(i).isRemove()) {
                bulletPlayer.remove(i);
            } else i++;
        }
        for (int i = 0; i < bulletBuff.size(); ) {
            if (bulletBuff.get(i).isRemove()) {
                bulletBuff.remove(i);
            } else i++;
        }
        // 敌人销毁
        for (int i = 0; i < enemy.size(); ) {
            if (enemy.get(i).isRemove()) {
                // 生成道具
                if (random.nextInt(100) > 80) {
                    if (random.nextInt(100) > 60)
                        bulletBuff.add(new Buff(Buff.BUFF2, enemy.get(i).x, enemy.get(i).y));
                    else
                        bulletBuff.add(new Buff(Buff.BUFF1, enemy.get(i).x, enemy.get(i).y));
                }
                Load.playSound("死亡");
                // 击杀一个敌人增加 1 分,不整这么多花里胡哨的
                fraction += 10;
                if (fraction / 100 == checkpoint) {
                    boss = new Boss2();
                    checkpoint += 1;
                    Load.playSound("警告");
                    new Thread(() -> {
                        tipsX = -Data.WIDTH;
                        try {
                            for (int n = 0; n < Data.WIDTH / 2; n++) {
                                tipsX += 2;
                                Thread.sleep(4);
                            }
                            Thread.sleep(2000);
                            for (int n = 0; n < Data.WIDTH / 4; n++) {
                                tipsX += 4;
                                Thread.sleep(4);
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        tipsX = -1000;
                    }).start();
                }
                enemy.remove(i);
            } else i++;
        }
        // boss销毁
        if (boss != null) {
            // boss 死亡掉落4个buff
            if (boss.isRemove()) {
                bulletBuff.add(new Buff(Buff.BUFF2, boss.x + boss.width / 2, boss.y + boss.height / 2));
                bulletBuff.add(new Buff(Buff.BUFF1, boss.x + boss.width / 2, boss.y + boss.height / 2));
                bulletBuff.add(new Buff(Buff.BUFF2, boss.x + boss.width / 2, boss.y + boss.height / 2));
                bulletBuff.add(new Buff(Buff.BUFF1, boss.x + boss.width / 2, boss.y + boss.height / 2));
                boss = null;
            }
        }
        boolean isPlay = false;
        // 检测我方子弹碰撞
        for (int i = 0; i < bulletPlayer.size(); i++) {
            Point point = bulletPlayer.get(i).getPoint();
            if (bulletPlayer.get(i).buffetIndex > 1) continue;
            // 检测子弹是否击中boss
            if (boss != null && boss.hp > 0) {
                Point rect[] = boss.getCollisionRect();
                if (Rect.isInternal(point.x, point.y, rect[0].x, rect[0].y, rect[1].x, rect[1].y)) {
                    boss.hp -= bulletPlayer.get(i).struts;
                    bulletPlayer.get(i).buffetIndex = 1;
                    bulletPlayer.get(i).speed = 5;
                    if (boss.hp <= 0) {
                        boss.imgIndex = 10;
                    }
                    if (!isPlay) {
                        isPlay = true;
                        Load.playSound("击中");
                    }
                    continue;
                }
            }
            for (Aircraft a : enemy) {
                Point rect[] = a.getCollisionRect();
                if (a.hp < 0) continue;
                if (Rect.isInternal(point.x, point.y, rect[0].x, rect[0].y, rect[1].x, rect[1].y)) {
                    if (!isPlay) {
                        isPlay = true;
                        Load.playSound("击中");
                    }
                    a.hp -= bulletPlayer.get(i).struts;
                    bulletPlayer.get(i).buffetIndex = 1;
                    bulletPlayer.get(i).speed = 5;
                    if (a.hp < 0) {
                        a.kill();;
                        a.speed = 1;
                    }
                    break;
                }
            }
        }
        Point rect[], point;
        // 检测敌方子弹碰撞
        if(player != null) {
            rect = player.getCollisionRect();
            if (player != null && player.hp > 0) {
                for (Bullet b : bulletEnemy) {
                    point = b.getPoint();
                    if (Rect.isInternal(point.x, point.y, rect[0].x, rect[0].y, rect[1].x, rect[1].y)) {
                        player.hp -= b.struts;
                        player.kill();
                        death();
                    }
                }
            }
        }
        // 吃BUFF
        if (player != null && player.hp > 0) {
            rect = player.getCollisionRect();
            for (Bullet buff : bulletBuff) {
                Point p = buff.getPoint();
                if (Rect.isInternal(p.x, p.y, rect[0].x, rect[0].y, rect[1].x, rect[1].y)) {
                    buff.x = -100;
                    if (buff.struts == Buff.BUFF1)
                        player.setBuff(16, 0);
                    else
                        player.setBuff(0, 16);
                }
            }
        }
        // 飞机之间的碰撞
        if(player != null) {
            for (Aircraft air : enemy) {
                int x = air.x + air.width / 2, y = air.y + air.height / 2;

                if(Rect.isInternal(x, y, player.x, player.y, player.width, player.height)) {
                    player.kill();
                    air.kill();
                    Load.playSound("失败");
                    death();
                }
            }
        }
    }

    // 管理场景所有的子弹的发射
    void attack() {
        // 我方飞机3帧发射一次
        if (player != null && player.hp > 0) {
            if (!player.isRemove() && fps % 3 == 0)
                bulletPlayer.addAll(Arrays.asList(player.attack()));
        }
        // 敌方飞机发射子弹
        if (fps % 5 == 0)
            for (Aircraft em : enemy)
                bulletEnemy.addAll(Arrays.asList(em.attack()));
        // boss发射子弹
        if (boss != null) bulletEnemy.addAll(Arrays.asList(boss.attack()));
    }

    // 生成敌方飞机
    void generate() {
        // BOSS 存在时不生成小飞机
        if (boss != null) return;

        if (fps % 100 != 0 && fps >= 1) return;

        Random random = new Random();
        int rn = random.nextInt(100) + 1;

        int[] hp = {(fps / 2000) + 1 * checkpoint, (fps / 2000) + 2 * checkpoint, (fps / 2000) + 5 * checkpoint, (fps / 2000) + 8 * checkpoint, (fps / 2000) + 11 * checkpoint};

        switch (rn / 10) {
            case 1: {
                enemy.add(new Enemy(Data.enemyAircraftImages[4], Data.enemyDeathImages[4], 2, 90, random.nextInt(300) + 100, -150, hp[4]));
                return;
            }
            case 2: {
                enemy.add(new Enemy(Data.enemyAircraftImages[3], Data.enemyDeathImages[3], 2, 90, 100, -150, hp[3]));
                enemy.add(new Enemy(Data.enemyAircraftImages[3], Data.enemyDeathImages[3], 2, 90, 380, -150, hp[3]));
                return;
            }
            case 3: {
                enemy.add(new Enemy(Data.enemyAircraftImages[2], Data.enemyDeathImages[2], 2, 90, 10, -150, hp[2]));
                enemy.add(new Enemy(Data.enemyAircraftImages[0], Data.enemyDeathImages[0], 2, 90, 240, -150, hp[0]));
                enemy.add(new Enemy(Data.enemyAircraftImages[2], Data.enemyDeathImages[2], 2, 90, 430 + 100, -150, hp[2]));
                return;
            }
            case 4: {
                enemy.add(new Enemy(Data.enemyAircraftImages[2], Data.enemyDeathImages[2], 2, 90, 0, -150, hp[2]));
                enemy.add(new Enemy(Data.enemyAircraftImages[3], Data.enemyDeathImages[3], 2, 90, 130, -150, hp[3]));
                enemy.add(new Enemy(Data.enemyAircraftImages[0], Data.enemyDeathImages[0], 2, 90, 300, -150, hp[0]));
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 90, 450, -150, hp[1]));
                return;
            }
            case 5: {
                enemy.add(new Enemy(Data.enemyAircraftImages[0], Data.enemyDeathImages[0], 2, 110, 400, random.nextInt(100) - 200, hp[0]));
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 110, 480, random.nextInt(100) - 200, hp[1]));
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 110, 560, random.nextInt(100) - 200, hp[1]));
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 110, 640, random.nextInt(100) - 200, hp[1]));
                enemy.add(new Enemy(Data.enemyAircraftImages[0], Data.enemyDeathImages[0], 2, 110, 720, random.nextInt(100) - 200, hp[0]));
                return;
            }
            case 6: {
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 70, -440, random.nextInt(100) - 200, hp[1]));
                enemy.add(new Enemy(Data.enemyAircraftImages[0], Data.enemyDeathImages[0], 2, 70, -320, random.nextInt(100) - 200, hp[0]));
                enemy.add(new Enemy(Data.enemyAircraftImages[0], Data.enemyDeathImages[0], 2, 70, -240, random.nextInt(100) - 200, hp[0]));
                enemy.add(new Enemy(Data.enemyAircraftImages[0], Data.enemyDeathImages[0], 2, 70, -170, random.nextInt(100) - 200, hp[0]));
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 70, -100, random.nextInt(100) - 200, hp[1]));
                return;
            }
            case 7: {
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 70, 30, random.nextInt(100) - 200, hp[1]));
                enemy.add(new Enemy(Data.enemyAircraftImages[2], Data.enemyDeathImages[2], 2, 70, 100, random.nextInt(100) - 200, hp[2]));
                enemy.add(new Enemy(Data.enemyAircraftImages[3], Data.enemyDeathImages[3], 2, 70, 200, random.nextInt(100) - 200, hp[3]));
                enemy.add(new Enemy(Data.enemyAircraftImages[2], Data.enemyDeathImages[2], 2, 70, 300, random.nextInt(100) - 200, hp[2]));
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 70, 430, random.nextInt(100) - 200, hp[1]));
                return;
            }
            case 8: {
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 30, -100, -150, hp[1]));
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 90, 240, -150, hp[1]));
                enemy.add(new Enemy(Data.enemyAircraftImages[1], Data.enemyDeathImages[1], 2, 120, 615 + 100, -150, hp[1]));
                return;
            }
            case 9: {
                enemy.add(new Enemy(Data.enemyAircraftImages[4], Data.enemyDeathImages[4], 2, 90, 100 + random.nextInt(100), -150, hp[4]));
                enemy.add(new Enemy(Data.enemyAircraftImages[4], Data.enemyDeathImages[4], 2, 90, 415 - random.nextInt(100), -150, hp[4]));
                return;
            }
            case 10: {
                enemy.add(new Enemy(Data.enemyAircraftImages[2], Data.enemyDeathImages[2], 2, 90, 120 + random.nextInt(100), -150, hp[2]));
                enemy.add(new Enemy(Data.enemyAircraftImages[2], Data.enemyDeathImages[2], 2, 90, 395 - random.nextInt(100), -150, hp[2]));
            }
        }
    }
    void death() {
        new Thread(() ->{
            try {
                player = null;
                Thread.sleep(3000);
                Data.canvas.switchScenes("Home");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

核心算法

@SuppressWarnings("serial")
public class GameMenu extends JFrame {

	GameMenu thisMenu;
	private JPanel contentPane;
	TestWindowBuilder fatherMenu;
	boolean isCheating;
	CMusic battleBGM,questCompleteBGM;

	int pressingW;
	int pressingS;
	int pressingA;
	int pressingD;
	int pressingJ;
	int pressingK;

	int playingSave;
	int playingProfessionID;

	int g_int1;

	Role playingRole;
	double playerX;//0-734
	double playerY;//0-312
	int rotationSpeed=15;//旋转速度
	int movementSpeed=3;//移动速度
	int NormalSpeed=3;
	int attackSpeed=3;//攻击速度
	int activeCounter;
	int attackCounter;
	int defenceCounter=0;
	int perfectDefenceTime=0;//完美格挡剩余时间(在敌人发动攻击前0.1秒启动的格挡能让格挡所需体力消耗减少到原来的十分之一)
	int defenceCooldown=0;//格挡冷却 这样阻止了玩家疯狂地启动/停止格挡
	int playerWidth=50;
	int playerHeight=50;
	int gamePhaseTimeCounter=0;
	int gamePhaseTimeCounter2=0;
	int endPhase=6*4;//游戏通关的阶段
	/*第一关 0
	 * 第二关 6
	 * */
	int gamePhase=0;//游戏开始时的阶段(正常玩家从第一关开始打,阶段应当从0开始)

	String humanIconContorler;

	JPanel viewMap;

	//玩家有两个Label 一个在boss上方 一个在boss下方
	int usingPlayerLabel=0;
	JLabel[] playerLabel=new JLabel[2];

	JLabel lblNewLabel_6;
	JLabel lblNewLabel_7;
	JLabel[] GiantBackGround=new JLabel[400];
	JLabel bossLabel;
	JLabel lblNewLabel_2;
	JLabel lblNewLabel_3;
	JLabel lblNewLabel_2B;
	JLabel lblNewLabel_3B;
	JLabel MobHead;
	JLabel MobName;
	JLabel MobHPBar;
	JLabel MobHPText;
	JLabel TitleLabelT;
	JLabel SubTitleLabelT;
	JLabel TitleLabel;
	JLabel SubTitleLabel;
	JPanel Titles;
	JLabel placeNameLabel;
	JLabel groundArrayLabel;
	JLabel placeChangeBlack;//换场地时的黑幕
	JLabel placeChangeBlack_1;//换场地时的黑幕(用于属性条)

	int maxProCount=5000;
	JLabel[] proLabel=new JLabel[maxProCount];
	boolean[] proIsUsed=new boolean[maxProCount];
	proLink proHead=new proLink();
	int existProCount;

	int maxParCount=5000;
	JLabel[] parLabel=new JLabel[maxParCount];
	boolean[] parIsUsed=new boolean[maxParCount];
	parLink parHead=new parLink();
	int existParCount;

	int existPro=0;
	int proTeamPointer=0;//队列指针 0-499

	int existPar=0;
	int parTeamPointer=0;

	JPanel panel;

	Mob boss;

	int allPhaseCount=1;
	int gameTime=0;

	Map map;

	/**
	 * Create the frame.
	 */
	public GameMenu(TestWindowBuilder fatherMenu,boolean isCheating,int professionID,int partID,int playingSave)
	{
		this.setTitle("CARROT MAN II");
		this.setIconImage(new ImageIcon("resource/down4.png").getImage());
		for(int i=0;i<proIsUsed.length;++i)
			proIsUsed[i]=false;
		for(int i=0;i<parIsUsed.length;++i)
			parIsUsed[i]=false;
		playingProfessionID=professionID;
		this.playingSave=playingSave;
		gamePhase=(partID-1)*6;
		this.fatherMenu=fatherMenu;
		this.isCheating=isCheating;
		//this.isCheating=true;//测试用
		g_int1=0;
		playerX=50;
		playerY=200;
		thisMenu=this;
		activeCounter=0;
		attackCounter=0;
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(fatherMenu.getBounds());
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		//转场黑幕 第100层
		placeChangeBlack=new JLabel("");
		placeChangeBlack.setIcon(new ImageIcon("resource/black.png"));
		placeChangeBlack.setVisible(true);
		placeChangeBlack_1=new JLabel("");
		placeChangeBlack_1.setIcon(new ImageIcon("resource/black.png"));
		placeChangeBlack_1.setVisible(true);
		placeChangeBlack.setBounds(0, 0, 784, 362);
		placeChangeBlack_1.setBounds(0, 0, 784, 362);
		//contentPane.add(placeChangeBlack);

		JPanel panel_1 = new JPanel();
		panel_1.setBounds(0, 0, 784, 50);
		contentPane.add(panel_1);
		panel_1.setLayout(null);

		panel_1.add(placeChangeBlack_1);

		JLabel lblNewLabel = new JLabel("");//头像
		lblNewLabel.setBounds(0, 0, 50, 50);
		lblNewLabel.setIcon(new ImageIcon("resource/HPBarHead.png"));
		panel_1.add(lblNewLabel);

		lblNewLabel_2B = new JLabel("");//血量字
		lblNewLabel_2B.setForeground(Color.WHITE);
		lblNewLabel_2B.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel_2B.setBounds(50, 0, 200, 25);
		panel_1.add(lblNewLabel_2B);

		lblNewLabel_3B = new JLabel("");//体力字
		lblNewLabel_3B.setForeground(Color.WHITE);
		lblNewLabel_3B.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel_3B.setBounds(50, 25, 200, 25);
		panel_1.add(lblNewLabel_3B);

		lblNewLabel_2 = new JLabel("");//血条
		lblNewLabel_2.setBounds(50, 0, 200, 25);
		lblNewLabel_2.setIcon(new ImageIcon("resource/RedBar.png"));
		panel_1.add(lblNewLabel_2);

		lblNewLabel_3 = new JLabel("");//体力条
		lblNewLabel_3.setBounds(50, 25, 200, 25);
		lblNewLabel_3.setIcon(new ImageIcon("resource/GreenBar.png"));
		panel_1.add(lblNewLabel_3);

		JLabel lblNewLabel_1 = new JLabel("");//血条体力条背景
		lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel_1.setBounds(50, 0, 200, 50);
		lblNewLabel_1.setIcon(new ImageIcon("resource/HPBarBG.png"));
		panel_1.add(lblNewLabel_1);

		JLabel lblNewLabel_4 = new JLabel("J");
		lblNewLabel_4.setForeground(Color.GRAY);
		lblNewLabel_4.setFont(new Font("黑体", Font.BOLD, 30));
		lblNewLabel_4.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel_4.setBounds(250, 0, 50, 50);
		panel_1.add(lblNewLabel_4);

		JLabel lblNewLabel_5 = new JLabel("");
		lblNewLabel_5.setFont(new Font("宋体", Font.PLAIN, 20));
		lblNewLabel_5.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel_5.setBounds(250, 0, 50, 50);
		lblNewLabel_5.setIcon(new ImageIcon("resource/skillJ.png"));
		panel_1.add(lblNewLabel_5);

		JLabel skillKLabel = new JLabel("K");
		skillKLabel.setForeground(Color.GRAY);
		skillKLabel.setFont(new Font("黑体", Font.BOLD, 30));
		skillKLabel.setHorizontalAlignment(SwingConstants.CENTER);
		skillKLabel.setBounds(300, 0, 50, 50);
		panel_1.add(skillKLabel);

		JLabel skillKLabel2 = new JLabel("");
		skillKLabel2.setFont(new Font("宋体", Font.PLAIN, 20));
		skillKLabel2.setHorizontalAlignment(SwingConstants.CENTER);
		skillKLabel2.setBounds(300, 0, 50, 50);
		skillKLabel2.setIcon(new ImageIcon("resource/skillK.png"));
		panel_1.add(skillKLabel2);

		placeNameLabel = new JLabel("");
		placeNameLabel.setFont(new Font("宋体", Font.PLAIN, 30));
		placeNameLabel.setHorizontalAlignment(SwingConstants.CENTER);
		placeNameLabel.setBounds(350, 0, 200, 50);
		panel_1.add(placeNameLabel);

		JLabel placeNameLabel2 = new JLabel("");
		placeNameLabel2.setHorizontalAlignment(SwingConstants.CENTER);
		placeNameLabel2.setBounds(350, 0, 200, 50);
		placeNameLabel2.setIcon(new ImageIcon("resource/placeNameBackGround.png"));
		panel_1.add(placeNameLabel2);

		MobHead = new JLabel("");
		MobHead.setHorizontalAlignment(SwingConstants.CENTER);
		MobHead.setBounds(550, 0, 50, 50);
		MobHead.setIcon(new ImageIcon("resource/MobHead_0.png"));
		panel_1.add(MobHead);

		MobName = new JLabel("");
		MobName.setHorizontalAlignment(SwingConstants.CENTER);
		MobName.setBounds(600, 0, 184, 25);
		panel_1.add(MobName);

		MobHPText = new JLabel("");
		MobHPText.setForeground(Color.WHITE);
		MobHPText.setHorizontalAlignment(SwingConstants.CENTER);
		MobHPText.setBounds(600, 25, 184, 25);
		panel_1.add(MobHPText);

		MobHPBar = new JLabel("");
		MobHPBar.setHorizontalAlignment(SwingConstants.CENTER);
		MobHPBar.setBounds(600, 25, 184, 25);
		MobHPBar.setIcon(new ImageIcon("resource/RedBar.png"));
		panel_1.add(MobHPBar);

		JLabel MobNameBG = new JLabel("");
		MobNameBG.setHorizontalAlignment(SwingConstants.CENTER);
		MobNameBG.setBounds(600, 0, 184, 50);
		MobNameBG.setIcon(new ImageIcon("resource/MobNameBG.png"));
		panel_1.add(MobNameBG);	

		panel = new JPanel();
		panel.setBounds(0, 50, 784, 362);
		contentPane.add(panel);
		viewMap=panel;
		panel.setLayout(null);

		panel.add(placeChangeBlack);

		lblNewLabel_7 = new JLabel("");//玩家tryingFace指示器(暂时停用)
		lblNewLabel_7.setBounds((int)playerX, (int)playerY, 5, 5);
		lblNewLabel_7.setIcon(new ImageIcon("resource/moveDeraction2.png"));
		lblNewLabel_7.setVisible(false);
		panel.add(lblNewLabel_7);

		//第99层
		//标题
		TitleLabelT = new JLabel("");
		TitleLabelT.setFont(new Font("黑体", Font.PLAIN, 45));
		TitleLabelT.setHorizontalAlignment(SwingConstants.CENTER);
		TitleLabelT.setBounds(100, 50, 584, 50);
		TitleLabelT.setVisible(true);
		panel.add(TitleLabelT);
		//副标题
		SubTitleLabelT = new JLabel("");
		SubTitleLabelT.setFont(new Font("黑体", Font.PLAIN, 25));
		SubTitleLabelT.setHorizontalAlignment(SwingConstants.CENTER);
		SubTitleLabelT.setBounds(100, 100, 584, 50);
		SubTitleLabelT.setVisible(true);
		panel.add(SubTitleLabelT);

		//预先创建粒子效果的Label,第6层
		for(int i=0;i<maxParCount;++i)
		{
			parLabel[i]=new JLabel("");
			panel.add(parLabel[i]);
		}

		//boss上方的玩家,第5层
		playerLabel[1]=new JLabel("");
		playerLabel[1].setHorizontalAlignment(SwingConstants.CENTER);
		playerLabel[1].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerHeight, playerWidth);
		playerLabel[1].setIcon(new ImageIcon("resource/HumanRight_0.png"));
		playerLabel[1].setVisible(false);
		panel.add(playerLabel[1]);

		//bossLabel,第4.5层
		bossLabel = new JLabel("");
		panel.add(bossLabel);

		//boss下方的玩家,第4层
		playerLabel[0]=new JLabel("");
		playerLabel[0].setHorizontalAlignment(SwingConstants.CENTER);
		playerLabel[0].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerHeight, playerWidth);
		playerLabel[0].setIcon(new ImageIcon("resource/HumanRight_0.png"));
		playerLabel[0].setVisible(true);
		panel.add(playerLabel[0]);

		//玩家面向方向指示器,第3层
		lblNewLabel_6 = new JLabel("");
		lblNewLabel_6.setBounds((int)playerX, (int)playerY, 5, 5);
		lblNewLabel_6.setIcon(new ImageIcon("resource/moveDeraction.png"));
		panel.add(lblNewLabel_6);

		//预先创建发射物的Label,第2层
		for(int i=0;i<maxProCount;++i)
		{
			proLabel[i]=new JLabel("");
			panel.add(proLabel[i]);
		}

		//创建地面箭头,第1.5层
		groundArrayLabel=new JLabel("");
		groundArrayLabel.setBounds(709,156, 50, 50);
		groundArrayLabel.setIcon(new ImageIcon("resource/groundArray.png"));
		groundArrayLabel.setVisible(false);
		panel.add(groundArrayLabel);

		//创建地面Label,第1层
		for(int i=0;i<400;++i)
		{
			GiantBackGround[i]=new JLabel("");
			GiantBackGround[i].setVisible(true);
			panel.add(GiantBackGround[i]);
		}	

		playingRole=new Role(professionID,thisMenu);

		KeyLininter kl=new KeyLininter(thisMenu);
        this.addKeyListener(kl);

		map=new Map(thisMenu);
		map.start();
	}

	//发射物相关
	public int addProjectile(Projectile pro)
	{
		existProCount=proHead.getLength();
		if(existProCount<maxProCount)
		{
			proHead.insert(new proLink(pro));
			int tempFinder=0;
			for(int i=0;i<maxProCount;++i)
			{
				if(proIsUsed[i]==false)
				{
					proIsUsed[i]=true;
					tempFinder=i;
					break;
				}
			}
			return tempFinder;
		}
		return -1;
	}
	public void removeProjectile(int id)
	{
		proLabel[id].setVisible(false);
		proIsUsed[id]=false;
	}
	public void allProjectilesFly()
	{
		proLink tempNode=proHead;
		while(tempNode.next!=null)
		{
			tempNode=tempNode.next;
			tempNode.data.doFly();
		}
	}
	//发射物相关结束

	//粒子效果相关
	public int addParticle(particle par)
	{
		existParCount=parHead.getLength();
		if(existParCount<maxParCount)
		{
			parHead.insert(new parLink(par));
			int tempFinder=0;
			for(int i=0;i<maxParCount;++i)
			{
				if(parIsUsed[i]==false)
				{
					parIsUsed[i]=true;
					tempFinder=i;
					break;
				}
			}
			return tempFinder;
		}
		return -1;
	}
	public void removeParticle(int id)
	{
		parLabel[id].setVisible(false);
		parIsUsed[id]=false;
	}
	public void allParticlesFly()
	{
		parLink tempNode=parHead;
		while(tempNode.next!=null)
		{
			tempNode=tempNode.next;
			tempNode.data.doFly();
		}
	}
	public void checkPlayerLocation()//检测玩家位置 如果超出地图 则拉回地图
	{
		if(playerX<playerWidth/2)
			playerX=playerWidth/2;
		if(playerX>784-playerWidth/2)
			playerX=784-playerWidth/2;
		if(playerY<playerHeight/2)
			playerY=playerHeight/2;
		if(playerY>362-playerHeight/2)
			playerY=362-playerHeight/2;
	}

	@SuppressWarnings("unused")
	public void saveData(int part)
	{
		if(Integer.parseInt(fatherMenu.saveSelectMenu.savedData[playingSave].split(" ")[1])<part)
		{
			String[] temp= {
					fatherMenu.saveSelectMenu.savedData[playingSave].split(" ")[0],
					fatherMenu.saveSelectMenu.savedData[playingSave].split(" ")[1]
			};
			fatherMenu.saveSelectMenu.savedData[playingSave]=""+playingProfessionID+" "+part;
			fatherMenu.saveSelectMenu.saveSaves();
		}
	}

	@SuppressWarnings({ "deprecation" })
	public void modTick()//每秒执行50次
	{
		if(attackCounter==0&&defenceCounter==0)
			playingRole.regenerate();
		if(playingRole.HP>0)
		{
			//刷新体力条
			lblNewLabel_3.setBounds(50, 25, (int) (200*playingRole.energy/playingRole.MaxEnergy), 25);
			lblNewLabel_3B.setText(""+(int)playingRole.energy+"/"+(int)playingRole.MaxEnergy);
			//刷新血条
			lblNewLabel_2.setBounds(50, 0, (int) (200*playingRole.HP/playingRole.MaxHP), 25);
			lblNewLabel_2B.setText(""+(int)playingRole.HP+"/"+(int)playingRole.MaxHP);
		}
		else if(gamePhase!=-1)
		{
			boss.target=null;
			gamePhaseTimeCounter=0;
			gamePhase=-1;
			movementSpeed=0;
			TitleLabelT.setText("YOU DIED");
			TitleLabelT.setVisible(true);
			playerLabel[usingPlayerLabel].setVisible(false);
			lblNewLabel_6.setVisible(false);
			lblNewLabel_3.setBounds(50, 25, (int) (200*playingRole.energy/playingRole.MaxEnergy), 25);
			lblNewLabel_3B.setText(""+(int)playingRole.energy+"/"+(int)playingRole.MaxEnergy);
			lblNewLabel_2.setBounds(50, 0, (int) (200*playingRole.HP/playingRole.MaxHP), 25);
			lblNewLabel_2B.setText(""+(int)playingRole.HP+"/"+(int)playingRole.MaxHP);
		}

		++gameTime;
		allProjectilesFly();
		allParticlesFly();
		if(gamePhase==0)
		{
			if(gamePhaseTimeCounter<50)
				gamePhaseTimeCounter=50;
			++gamePhaseTimeCounter;
			if(gamePhaseTimeCounter==51)
			{
				System.out.println("启动控制台...");
				movementSpeed=0;
				placeChangeBlack.setBounds(0, 0, 784, 362);
				placeChangeBlack_1.setBounds(0, 0, 784, 362);
				placeChangeBlack.setVisible(true);
				placeChangeBlack_1.setVisible(true);
				TitleLabelT.setVisible(false);
				SubTitleLabelT.setVisible(false);
				groundArrayLabel.setVisible(false);
				for(int i=0;i<128;++i)//初始化第一关地面
				{
					String backGroundContorler="resource/ground";
					GiantBackGround[i].setBounds(50*(i%16),50*(int)(i/16), 50, 50);
					if(Math.random()<0.9)
						backGroundContorler=backGroundContorler+"1.png";
					else
						backGroundContorler=backGroundContorler+"2.png";
					GiantBackGround[i].setIcon(new ImageIcon(backGroundContorler));
				}
				playerX=50;
				playerY=200;
				placeNameLabel.setText(fatherMenu.textLib.textData[13]);
				TitleLabelT.setText(fatherMenu.textLib.textData[13]);
				TitleLabelT.setVisible(true);
				SubTitleLabelT.setText(fatherMenu.textLib.textData[37]);
				SubTitleLabelT.setVisible(true);
			}
			if(gamePhaseTimeCounter>=100&&gamePhaseTimeCounter<=150)
			{
				placeChangeBlack.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);
				placeChangeBlack_1.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);
			}
			if(gamePhaseTimeCounter==151)
			{
				startNewBattleBGM(1);
				placeChangeBlack.setVisible(false);
				placeChangeBlack_1.setVisible(false);
				gamePhaseTimeCounter=0;
				++gamePhase;
			}
		}
		if(gamePhase%6==1)
		{
			++gamePhaseTimeCounter;
			if(gamePhaseTimeCounter>=200)
			{
				++gamePhase;
				TitleLabelT.setVisible(false);
				SubTitleLabelT.setVisible(false);
				movementSpeed=NormalSpeed;
			}
		}
		if(gamePhase==2)
		{
			gamePhaseTimeCounter=0;
			boss=new Mob(1,bossLabel,thisMenu);
			boss.reflash();
			bossLabel.setVisible(true);
			++gamePhase;
		}
		if(gamePhase==3)
		{
			if(boss.HP>0)
				boss.reflash();
			else
			{
				bossLabel.setVisible(false);
				MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);
				MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);
				++gamePhase;
				gamePhaseTimeCounter=0;
				TitleLabelT.setText(fatherMenu.textLib.textData[38]);
				TitleLabelT.setVisible(true);
				SubTitleLabelT.setText(fatherMenu.textLib.textData[39]);
				SubTitleLabelT.setVisible(true);
				saveData(2);
				startQuestCompleteBGM();
				endBattleBGM();
			}
		}
		if(gamePhase%6==4)
		{
			playingRole.percentReHP(0.005);
			++gamePhaseTimeCounter;
			if(gamePhaseTimeCounter>200)
			{
				gamePhaseTimeCounter=0;
				++gamePhase;
				TitleLabelT.setText(fatherMenu.textLib.textData[40]);
				TitleLabelT.setVisible(true);
				SubTitleLabelT.setText(fatherMenu.textLib.textData[41]);
				SubTitleLabelT.setVisible(true);
				gamePhaseTimeCounter2=0;
			}
		}
		if(gamePhase%6==5)
		{
			++gamePhaseTimeCounter;
			if(gamePhaseTimeCounter2==0)
			{
				if(gamePhaseTimeCounter>50)
				{
					groundArrayLabel.setVisible(true);
					if(playerX>709&&playerX<759&&playerY>156&&playerY<206)//进入箭头
					{
						gamePhaseTimeCounter=0;
						gamePhaseTimeCounter2=1;
						movementSpeed=0;
						placeChangeBlack.setBounds(-784,0,784,362);
						placeChangeBlack.setVisible(true);
						placeChangeBlack_1.setBounds(-784,0,784,362);
						placeChangeBlack_1.setVisible(true);
					}
				}
			}
			if(gamePhaseTimeCounter2==1)
			{
				if(gamePhaseTimeCounter>=0&&gamePhaseTimeCounter<=50)
				{
					placeChangeBlack.setBounds((int)(gamePhaseTimeCounter*0.02*784-784), 0, 784, 362);
					placeChangeBlack_1.setBounds((int)(gamePhaseTimeCounter*0.02*784-784), 0, 784, 362);
				}
				if(gamePhaseTimeCounter==51)
				{
					++gamePhase;
					gamePhaseTimeCounter=0;
				}
			}
		}
		if(gamePhase==6)
		{
			movementSpeed=0;
			if(gamePhaseTimeCounter<50)
				gamePhaseTimeCounter=50;
			++gamePhaseTimeCounter;
			if(gamePhaseTimeCounter==51)
			{
				placeChangeBlack.setBounds(0, 0, 784, 362);
				placeChangeBlack.setVisible(true);
				placeChangeBlack_1.setBounds(0, 0, 784, 362);
				placeChangeBlack_1.setVisible(true);
				TitleLabelT.setVisible(false);
				SubTitleLabelT.setVisible(false);
				groundArrayLabel.setVisible(false);
				for(int i=0;i<325;++i)
				{
					GiantBackGround[i].setBounds(32*(i%25),32*(int)(i/25), 32, 32);
					GiantBackGround[i].setIcon(new ImageIcon("resource/ground6.png"));
				}
				playerX=50;
				playerY=200;
				placeNameLabel.setText(fatherMenu.textLib.textData[14]);
				TitleLabelT.setText(fatherMenu.textLib.textData[14]);
				TitleLabelT.setVisible(true);
				SubTitleLabelT.setText(fatherMenu.textLib.textData[42]);
				SubTitleLabelT.setVisible(true);
			}
			if(gamePhaseTimeCounter>=100&&gamePhaseTimeCounter<=150)
			{
				placeChangeBlack.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);
				placeChangeBlack_1.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);
			}
			if(gamePhaseTimeCounter==151)
			{
				startNewBattleBGM(2);
				placeChangeBlack.setVisible(false);
				placeChangeBlack_1.setVisible(false);
				gamePhaseTimeCounter=0;
				++gamePhase;
			}
		}
		if(gamePhase==8)
		{
			gamePhaseTimeCounter=0;
			boss=new Mob(2,bossLabel,thisMenu);
			bossLabel.setBounds(375, 175, 100, 100);
			boss.reflash();
			bossLabel.setVisible(true);
			++gamePhase;
		}
		if(gamePhase==9)
		{
			if(boss.HP>0)
				boss.reflash();
			else
			{
				bossLabel.setVisible(false);
				MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);
				MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);
				++gamePhase;
				gamePhaseTimeCounter=0;
				TitleLabelT.setText(fatherMenu.textLib.textData[43]);
				TitleLabelT.setVisible(true);
				SubTitleLabelT.setText(fatherMenu.textLib.textData[39]);
				SubTitleLabelT.setVisible(true);
				saveData(3);
				startQuestCompleteBGM();
				endBattleBGM();
			}
		}
		if(gamePhase==12)
		{
			movementSpeed=0;
			if(gamePhaseTimeCounter<50)
				gamePhaseTimeCounter=50;
			++gamePhaseTimeCounter;
			if(gamePhaseTimeCounter==51)
			{
				placeChangeBlack.setBounds(0, 0, 784, 362);
				placeChangeBlack.setVisible(true);
				placeChangeBlack_1.setBounds(0, 0, 784, 362);
				placeChangeBlack_1.setVisible(true);
				TitleLabelT.setVisible(false);
				SubTitleLabelT.setVisible(false);
				groundArrayLabel.setVisible(false);
				for(int i=0;i<325;++i)
				{
					GiantBackGround[i].setBounds(32*(i%25),32*(int)(i/25), 32, 32);
					GiantBackGround[i].setIcon(new ImageIcon("resource/ground7.png"));
				}
				playerX=50;
				playerY=200;
				placeNameLabel.setText(fatherMenu.textLib.textData[15]);
				TitleLabelT.setText(fatherMenu.textLib.textData[15]);
				TitleLabelT.setVisible(true);
				SubTitleLabelT.setText(fatherMenu.textLib.textData[44]);
				SubTitleLabelT.setVisible(true);
			}
			if(gamePhaseTimeCounter>=100&&gamePhaseTimeCounter<=150)
			{
				placeChangeBlack.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);
				placeChangeBlack_1.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);
			}
			if(gamePhaseTimeCounter==151)
			{
				startNewBattleBGM(3);
				placeChangeBlack.setVisible(false);
				placeChangeBlack_1.setVisible(false);
				gamePhaseTimeCounter=0;
				++gamePhase;
			}
		}
		if(gamePhase==14)
		{
			gamePhaseTimeCounter=0;
			boss=new Mob(3,bossLabel,thisMenu);
			bossLabel.setBounds(375, 175, 100, 100);
			boss.reflash();
			bossLabel.setVisible(true);
			++gamePhase;
		}
		if(gamePhase==15)
		{
			if(boss.HP>0)
				boss.reflash();
			else
			{
				bossLabel.setVisible(false);
				MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);
				MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);
				++gamePhase;
				gamePhaseTimeCounter=0;
				TitleLabelT.setText(fatherMenu.textLib.textData[45]);
				TitleLabelT.setVisible(true);
				SubTitleLabelT.setText(fatherMenu.textLib.textData[39]);
				SubTitleLabelT.setVisible(true);
				saveData(4);
				startQuestCompleteBGM();
				endBattleBGM();
			}
		}
		if(gamePhase==18)
		{
			movementSpeed=0;
			if(gamePhaseTimeCounter<50)
				gamePhaseTimeCounter=50;
			++gamePhaseTimeCounter;
			if(gamePhaseTimeCounter==51)
			{
				placeChangeBlack.setBounds(0, 0, 784, 362);
				placeChangeBlack.setVisible(true);
				placeChangeBlack_1.setBounds(0, 0, 784, 362);
				placeChangeBlack_1.setVisible(true);
				TitleLabelT.setVisible(false);
				SubTitleLabelT.setVisible(false);
				groundArrayLabel.setVisible(false);
				//需要修改开始
				for(int i=0;i<325;++i)
				{
					GiantBackGround[i].setBounds(32*(i%25),32*(int)(i/25), 32, 32);
					GiantBackGround[i].setIcon(new ImageIcon("resource/ground8.png"));
				}
				//需要修改结束
				playerX=50;
				playerY=200;
				//需要修改开始
				placeNameLabel.setText(fatherMenu.textLib.textData[70]);
				TitleLabelT.setText(fatherMenu.textLib.textData[70]);
				TitleLabelT.setForeground(Color.LIGHT_GRAY);
				TitleLabelT.setVisible(true);
				SubTitleLabelT.setText(fatherMenu.textLib.textData[71]);
				SubTitleLabelT.setForeground(Color.LIGHT_GRAY);
				//需要修改结束
				SubTitleLabelT.setVisible(true);
			}
			if(gamePhaseTimeCounter>=100&&gamePhaseTimeCounter<=150)
			{
				placeChangeBlack.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);
				placeChangeBlack_1.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);
			}
			if(gamePhaseTimeCounter==151)
			{
				startNewBattleBGM(4);//需要修改
				placeChangeBlack.setVisible(false);
				placeChangeBlack_1.setVisible(false);
				gamePhaseTimeCounter=0;
				++gamePhase;
			}
		}
		if(gamePhase==20)
		{
			gamePhaseTimeCounter=0;
			boss=new Mob(4,bossLabel,thisMenu);//需要修改
			bossLabel.setBounds(375, 175, 100, 100);//需要修改
			boss.reflash();
			bossLabel.setVisible(true);
			++gamePhase;
		}
		if(gamePhase==21)
		{
			if(boss.HP>0)
				boss.reflash();
			else
			{
				bossLabel.setVisible(false);
				MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);
				MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);
				++gamePhase;
				gamePhaseTimeCounter=0;
				//需要修改开始
				TitleLabelT.setText(fatherMenu.textLib.textData[72]);
				TitleLabelT.setForeground(Color.LIGHT_GRAY);
				TitleLabelT.setVisible(true);
				SubTitleLabelT.setText(fatherMenu.textLib.textData[39]);
				TitleLabelT.setForeground(Color.LIGHT_GRAY);
				SubTitleLabelT.setVisible(true);
				//saveData(4);
				//需要修改完成
				startQuestCompleteBGM();
				endBattleBGM();
			}
		}
		if(gamePhase==endPhase)
		{
			endBattleBGM();
			winMenu WM=new winMenu(thisMenu);
			WM.setVisible(true);
			thisMenu.setVisible(false);
			map.stop();
		}
		if(gamePhase==-1)
		{
			if(boss.HP>0)
				boss.reflash();
			++gamePhaseTimeCounter;
			if(gamePhaseTimeCounter>250)
			{
				endBattleBGM();
				loseMenu LM=new loseMenu(thisMenu);
				LM.setVisible(true);
				thisMenu.setVisible(false);
				map.stop();
			}
		}

		//刷新bossBar
		if(boss!=null&&gamePhase%6==3)
		{
			MobHead.setIcon(new ImageIcon("resource/MobHead_"+boss.MobId+".png"));
			MobName.setText(""+boss.Name);
			MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);
			MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);
		}

		//玩家试图面向方向
		if(attackCounter==0&&defenceCounter==0)
		{
			if(pressingD==1&&pressingW==0&&pressingS==0)
			{
				playingRole.tryingFace=0;
			}
			else if(pressingD==1&&pressingW==1)
			{
				playingRole.tryingFace=45;
			}
			else if(pressingW==1&&pressingA==0&&pressingD==0)
			{
				playingRole.tryingFace=90;
			}
			else if(pressingW==1&&pressingA==1)
			{
				playingRole.tryingFace=135;
			}
			else if(pressingA==1&&pressingW==0&&pressingS==0)
			{
				playingRole.tryingFace=180;
			}
			else if(pressingA==1&&pressingS==1)
			{
				playingRole.tryingFace=225;
			}
			else if(pressingS==1&&pressingA==0&&pressingD==0)
			{
				playingRole.tryingFace=270;
			}
			else if(pressingS==1&&pressingD==1)
			{
				playingRole.tryingFace=315;
			}
		}

		playingRole.setFace();
		humanIconContorler="resource/human_"+playingRole.face;

		if(attackCounter==0&&defenceCounter==0&&(pressingW==1||pressingS==1||pressingA==1||pressingD==1))//进行转向
		{
			double d_angle=(playingRole.facingAngle-playingRole.tryingFace+360)%360;//0-180为顺时针
			if(d_angle<=rotationSpeed||d_angle>=360-rotationSpeed)//旋转功能
			{
				playingRole.facingAngle=playingRole.tryingFace;
			}
			else
			{
				if(d_angle>0&&d_angle<=180)
				{
					playingRole.facingAngle-=rotationSpeed;
				}
				else
				{
					playingRole.facingAngle+=rotationSpeed;
				}
			}
		}

		if(attackCounter==0&&defenceCounter==0&&(pressingW==1||pressingS==1||pressingA==1||pressingD==1))//进行移动
		{
			++activeCounter;
			playerX+=(int)(movementSpeed*Math.cos(playingRole.facingAngle*Math.PI/180));
			playerY-=(int)(movementSpeed*Math.sin(playingRole.facingAngle*Math.PI/180));
			checkPlayerLocation();
			if(activeCounter>=10)//10Tick一次 切换移动图片
			{
				activeCounter=0;
				playingRole.lastMoveActive=(playingRole.lastMoveActive+1)%4;
			}
			if(playingRole.lastMoveActive==2)
				humanIconContorler=humanIconContorler+'_'+0;
			else if(playingRole.lastMoveActive==3)
				humanIconContorler=humanIconContorler+'_'+2;
			else
				humanIconContorler=humanIconContorler+'_'+playingRole.lastMoveActive;
		}

		if(pressingJ==1&&attackCounter==0&&defenceCounter==0&&playingRole.HP>0)//发动攻击
		{
			attackCounter=1;
		}

		if(attackCounter>0&&attackCounter<=8*attackSpeed)//正在攻击
		{
			++attackCounter;
			if(attackCounter>0&&attackCounter<=attackSpeed)
			{
				humanIconContorler=humanIconContorler+'_'+3;
			}
			else if(attackCounter<=2*attackSpeed)
			{
				humanIconContorler=humanIconContorler+'_'+4;
			}
			else if(attackCounter<=3*attackSpeed)
			{
				humanIconContorler=humanIconContorler+'_'+5;
			}
			else if(attackCounter<=4*attackSpeed)
			{
				humanIconContorler=humanIconContorler+'_'+6;
			}
			else if(attackCounter<=5*attackSpeed)
			{
				humanIconContorler=humanIconContorler+'_'+7;
			}
			else if(attackCounter<=6*attackSpeed)
			{
				humanIconContorler=humanIconContorler+'_'+8;
			}
			else if(attackCounter<=7*attackSpeed)
			{
				humanIconContorler=humanIconContorler+'_'+9;
			}
		}

		if(attackCounter==3*attackSpeed)//完成攻击
		{
			playingRole.costEnergy(10);
			fatherMenu.startNewSound("sweep"+Calculator.randomInt(1,3)+".wav",false,1);
			playingRole.doAttack();
		}
		if(attackCounter>8*attackSpeed)//结束硬直
		{
			attackCounter=0;
		}

		if(defenceCooldown>0)
		{
			--defenceCooldown;
		}
		if(perfectDefenceTime>0)
		{
			--perfectDefenceTime;
		}
		if(pressingK==1&&attackCounter==0&&defenceCounter==0&&defenceCooldown==0)//发动防御
		{
			perfectDefenceTime=5;
			defenceCounter=1;
			playingRole.defenceStance=true;
			playingRole.isBlocked=false;
		}
		if(defenceCounter==1)
		{
			if(pressingK==0)//解除格挡
			{
				defenceCounter=0;
				playingRole.defenceStance=false;
				if(playingRole.isBlocked==true)
					defenceCooldown=0;
				else
					defenceCooldown=30;
			}
			else
			{
				humanIconContorler=humanIconContorler+'_'+10;
			}
		}

		humanIconContorler=humanIconContorler+".png";
		if(boss!=null&&playingRole.HP>0)
		{
			if(playerY>=boss.bossY&&usingPlayerLabel==0)//玩家应当盖住boss,但是却没盖住
			{
				usingPlayerLabel=1;
				playerLabel[0].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);
				playerLabel[1].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);
				playerLabel[0].setVisible(false);
				playerLabel[1].setVisible(true);
			}
			if(playerY<boss.bossY&&usingPlayerLabel==1)//boss应当盖住玩家,但是却没盖住
			{
				usingPlayerLabel=0;
				playerLabel[0].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);
				playerLabel[1].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);
				playerLabel[0].setVisible(true);
				playerLabel[1].setVisible(false);
			}
		}
		playerLabel[usingPlayerLabel].setIcon(new ImageIcon(humanIconContorler));
		playerLabel[usingPlayerLabel].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);
		lblNewLabel_6.setBounds((int)playerX+(int)(25*Math.cos(playingRole.facingAngle*Math.PI/180))-2, (int)playerY-(int)(25*Math.sin(playingRole.facingAngle*Math.PI/180))-2, 4,4);
		lblNewLabel_7.setBounds((int)playerX+(int)(25*Math.cos(playingRole.tryingFace*Math.PI/180))-2, (int)playerY-(int)(25*Math.sin(playingRole.tryingFace*Math.PI/180))-2, 4,4);
	}

	public void startNewBattleBGM(int bossID)
	{
		if(fatherMenu.settingLib.settings[1].equals("1"))
		{
			if(battleBGM!=null)
				battleBGM.endMusic();
			battleBGM=new CMusic("boss"+bossID+".wav",true,1);
			battleBGM.start();
		}
	}

	public void endBattleBGM()
	{
		if(battleBGM!=null)
			battleBGM.endMusic();
	}

	public void startQuestCompleteBGM()
	{
		if(questCompleteBGM!=null)
			questCompleteBGM.endMusic();
		questCompleteBGM=new CMusic("QuestComplete.wav",false,1);
		questCompleteBGM.start();
	}

}

总结

通过此次的《飞机大战-I》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

以上就是Java实现经典游戏飞机大战-I的示例代码的详细内容,更多关于Java飞机大战的资料请关注我们其它相关文章!

(0)

相关推荐

  • java实现飞机大战案例详解

    前言 飞机大战是一个非常经典的案例,因为它包含了多种新手需要掌握的概念,是一个非常契合面向对象思想的入门练习案例 程序分析: 在此游戏中共有六个对象: 小敌机Airplane,大敌机BigAirplane,小蜜蜂Bee,天空Sky,英雄机Hero,子弹Bullet 其次我们还需要三个类: 超类Flyer,图片类Images,测试类World 还需: 英雄机2张,小敌机,大敌机,小蜜蜂,子弹,天空各1张,爆炸图4张,游戏开始,暂停,游戏结束各1张,共14张图片放入与图片类Images同包中 超类F

  • java版飞机大战实战项目详细步骤

    本文为大家分享了java版飞机大战实战项目,供大家参考,具体内容如下 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是普通飞机),另一种就是打死有奖励的敌人.他们都应该是飞行物的子类,我们也可以为普通飞机和给奖励的敌人设一个接口让他们去实现接口,这样有利于以后的扩展,我在这里给的简化版的飞机大战,主要是为了让大家了解面向对象. 第一步建立飞行物类 impor

  • java实战之飞机大战小游戏(源码加注释)

    一.工程文件 二.Main.java 主函数,实现类 package ui; //主函数实现 public class Main { public static void main(String[] args) { //创建窗体 GameFrame frame = new GameFrame(); //创建面板 GamePanel panel = new GamePanel(frame); //调用开始游戏的方法启动游戏 panel.action(); //将面板加入到窗体中 frame.add

  • java实现飞机大战游戏

    java实现飞机大战 用Java写个飞机大战游戏练习一下,实现可播放游戏背景音乐和游戏的基本功能 设计 1.准备好相应的图片和背景音乐(.wav文件): 2.直接看源码: 3.还有部分功能未实现. 源码 package forGame 加载游戏图片类 package forGame; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.Fil

  • 一天时间用Java写了个飞机大战游戏,朋友直呼高手

    一.代码实现 创建窗口 首先创建一个游戏窗体类GameFrame,继承至JFrame,用来显示在屏幕上(window的对象),每个游戏都有一个窗口,设置好窗口标题.尺寸.布局等就可以. /* * 游戏窗体类 */ public class GameFrame extends JFrame { public GameFrame() { setTitle("飞机大战");//设置标题 setSize(526, 685);//设定尺寸 setLayout(new BorderLayout()

  • Java实现飞机大战-连接数据库并把得分写入数据库

    编写飞行物类 package com.tarena.shoot; import java.awt.image.BufferedImage; /** * 飞行物(敌机,蜜蜂,子弹,英雄机) */ public abstract class FlyingObject { protected int x; protected int y; protected int width; protected int height; protected BufferedImage image; protecte

  • Java实现经典游戏飞机大战-I的示例代码

    目录 前言 主要设计 功能截图 代码实现 启动类 核心类 核心算法 总结 前言 <飞机大战-I>是一款融合了街机.竞技等多种元素的经典射击手游.华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 玩家控制一台战斗机,以消灭所有的敌机为胜利,有些敌机会掉落装备,不可错过哦 主要设计 1. 用Swing库做可视化界面 2.鼠标控制战

  • Java实现游戏飞机大战-III的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏面板类 商店类 总结 前言 <飞机大战-III>是一款融合了街机.竞技等多种元素的经典射击手游.华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 基于Java Swing,以飞机大战为原形,以抗日电视剧<亮剑>中的“李云龙”为主题,实现菜单.选关.难度.等级.技能等功能

  • JAVA实现经典游戏坦克大战的示例代码

    目录 前言 主要设计 功能截图 代码实现 总结 前言 小时候大家都玩过坦克大战吧,熟悉的旋律和丰富的关卡陪伴了我们一整个寒暑假,还记得传说中的经典坦克大战 吗?那些怀旧的记忆,伴随着我们一起走过来的经典坦克大战,刚开始那战战兢兢,屡屡被敌人坦克击毁的情景历历在目.现在好了,再也不用担心敌人坦克了,可 以横冲直撞,横扫敌人坦克了.快哉!!! <坦克大战>游戏以坦克战斗为主题,用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 可以生成不同的地图,消灭地

  • Java实现简单的飞机大战游戏(控制主飞机篇)

    本文实例为大家分享了Java实现简单的飞机大战游戏,控制主飞机的具体代码,供大家参考,具体内容如下 接着上一篇:Java实现简单的飞机大战游戏(敌机下落篇),首先我们需要明白,在控制一架飞机的时候,需要通过对键盘的监听.上下左右比较简单,因为是对单一按键的监听,在这里我们可以通过switch语句,通过读取键盘上每个按键的ASCII值.但是如果想要实现边飞行边发射子弹,又或者是实现斜飞怎么办?这里就需要通过对多个按键的监听.解决的方法是:单一的方向控制我们还是使用switch语句,但是如果牵扯到2

  • Python实战小游戏飞机大战详解

    目录 导语 ​正文 一.环境安装 二.我方飞机 三.敌方飞机 四.控制键盘移动 五.检测子弹碰撞 六.效果图 总结 导语 "看见别人都那么努力,那么勤奋,那么意气风发地走在成功的道路上,你问问自己:难道就不想成为他们的绊脚石吗?" --周一整理好心情好好出发吧! 大家好啊,还在学习的小小伙伴儿慢慢学哈~学完基础的你,今天可以放松下,跟着小编玩会儿游戏再继续哦! 新的一周要努力哦!赶不上别人至少也要慢慢溜上去,晓得吧?乖巧.jpg "晓得晓得,会努力的". ​大家还记

  • Java实现经典游戏复杂迷宫

    目录 前言 主要设计 功能截图 代码实现 总结 前言 人类建造迷宫已有5000年的历史.在世界的不同文化发展时期,这些奇特的建筑物始终吸引人们沿着弯弯曲曲.困难重重的小路吃力地行走,寻找真相.迷宫类小游戏应运而生.在游戏中,迷宫被表现为冒险舞台里,藏有各式各样奇妙与谜题或宝藏的危险区域.型态有洞窟.人工建筑物.怪物巢穴.密林或山路等.迷宫内有恶徒或凶猛的生物(真实存在或想像物体都有)徘徊,其中可能会有陷阱.不明设施.遗迹等. <复杂迷宫>游戏是用java语言实现,采用了swing技术进行了界面

  • Java实现经典游戏2048的示例代码

    目录 前言 主要设计 功能截图 代码实现 界面布局类 业务逻辑类 总结 前言 2014年Gabriele Cirulli利用周末的时间写2048这个游戏的程序,仅仅只是好玩而已.他想用一种不同的视觉展现效果和更快速的动画来创造属于自己的游戏版本. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 每次控制所有方块向同一个方向运动,两个相同数字的方块撞在一起之后合并成为他们的和,每次操作之后会在空白的方格处随机生成一个2或者4,最终得到一个“20

  • Java实现经典游戏推箱子的示例代码

    目录 前言 主要设计 功能截图 代码实现 核心类 声音播放类 总结 前言 <推箱子>推箱子是一个古老的游戏,目的是在训练你的逻辑思考能力.在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 控制搬运工上下左右移动,来将箱子推到指定地点 主要设计 1.游戏面板生成显示

  • Java实现经典游戏Flappy Bird的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 核心类 工具类 总结 前言 <布谷鸟闯关-简单版>是一个基于java的布谷鸟闯关游戏,摁上键控制鸟的位置穿过管道间的缝隙,需要做碰撞检测,监听键盘事件,背景图片的切换,障碍物管道产生时y轴上需要随机位置. 主要设计 设计游戏界面,用swing实现 设计背景 设计移动墙 设计布谷鸟 设计障碍物 设计背景音乐和音效 由几个关键的布尔类型变量start,crash,over是产生键键盘事件时用来控制界面显示的弹框的 操作:空格键开始游戏,ente

随机推荐