JAVA 实现《飞机大战-I》游戏

前言

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

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

主要需求

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

主要设计

1、 用Swing库做可视化界面

2、鼠标控制战斗机移动

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

4、用流实现音乐播放。

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

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

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

8、生成敌方飞机算法

9、分数计算算法

功能截图

游戏开始

image-20220205173227620

战斗效果:

image-20220205173306845

代码实现

启动类


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最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

源码获取

源码下载地址:传送门------->

点赞,关注博主后,私聊博主免费获取
需要技术指导,写项目程序,等更多服务请联系博主

今天是持续写作的第 10 / 100 天。
可以关注我,点赞我、评论我、收藏我啦。

  • 23
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
基于Java飞机大战游戏的设计与实现设计软件源码+word毕业论文文档。基于Java飞机大战游戏主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐。我方飞机可以随意移动,敌方飞机无规律出现。游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就一直能发射子弹,当我方子弹碰到敌方飞机时,敌方飞机消失。当玩家飞机碰到敌方子弹时,生命值减一,直到玩家飞机生命值为一时,游戏结束。基本模块包括:游戏状态控制功能模块、游戏难度的调整模块、游戏界面绘画功能模块、玩家游戏控制功能模块等。本系统结构如下: (1)游戏状态控制功能模块:游戏的状态控制包括运行及结束游戏,首先进入游戏的开始页面,在游戏进行时,玩家必须躲避或者击落敌方飞机,玩家飞机的生命值降低为0的时候游 戏就会结束,弹出游戏结束界面 (2)游戏难度的调整模块:玩家玩的时间越长游戏的难度越高,敌方飞机的数量越多、敌方飞机出现的频率越高,玩家保证飞机的存活的难度越高,操作难度相应也高。 (3)游戏界面绘画功能模块:左上角会显示玩家飞机当前生命值,游戏时间,当前分数,其他地方用来输出玩家对我方飞机的控制与敌方飞机的动作显示 (4)玩家游戏控制功能模块: 玩家可以通过控制鼠标或者键盘来控制方飞机(Hero airplane)的移动。 目 录 1 引言 1 1.1 项目背景 1 1. 2 国内外研究现状 3 1.3 项目主要工作 4 1.4 本文组织结构 6 2 开发平台与开发技术 7 2. 1 IntelliJ IDEA简介 7 2. 2 IntelliJ IDEA与Eclipse 、MyEclipse的比较 8 2. 3 Java 10 3 可行性研究 13 3. 1 技术可行性 13 3. 2 经济可行性 13 3. 3 操作可行性 14 3. 4 用户使用可行性 14 3. 5 法律可行性 14 4 需求分析 15 4. 1 系统需求概述 16 4. 2 功能模块设计 17 4.2.1 游戏状态控制功能模块 17 4.2.2 游戏难度的调整模块 17 4.2.3 游戏界面绘画功能模块 17 4.2.4 玩家游戏控制功能模块 17 4. 3 游戏难点分析 18 4.3.1 绘图美化 18 4.3.2 多线程技术的实现 18 4.3.3 防碰撞问题的解决 18 4.3.4 动画的实现 18 5 飞机大战功能实现 19 5.1 模型图 19 5.2 软件功能模块 19 5.3 游戏首页的实现 20 5.3.1 界面实现 20 5.3.2 流程图 21 5.3.3 核心代码 22 5.4 游戏开始模块的实现 24 5.4.1 界面实现 24 5.4.2 流程图 25 5.4.3 核心代码 25 5.5 发射子弹模块的实现 27 5.5.1 界面实现 27 5.5.2 流程图 28 5.5.3 核心代码 29 5.6 积分模块的实现 33 5.6.1 界面的实现 33 5.6.2 核心代码 34 5.7 防碰撞逻辑 37 5.7.1 核心代码 37 5.8 游戏操作的实现 39 5.8.1 核心代码 39 5.9 特殊NPC蜜蜂 41 6 系统测试 42 6.1 测试的定义及其重要性 43 6.1.1 测试的定义 43 6.1.2 测试的重要性 44 6.2 测试方法 46 6.3 测试结果 50 7 结论 51 参考文献 52 致谢 54 外文文献 55 中文翻译 63 1 引言 1.1 项目背景 90后的我们,童年最开始接触电子游戏是在游戏厅,那时候的飞机大战游戏机前,往往人山人海,绚丽多彩的画面,带感操作让人沉醉不能自拔。再后来,珍珠港(Pearl Harbor),虎虎虎(Tora! Tora! Tora!)等空战电影中激烈的空战和飞机在天空中的英姿让我彻底爱上了空战,所以毕业设计我选择了与飞机战斗有关——基于Java飞机大战游戏的设计与实现的毕业设计。 而选基于Java飞机大战游戏的设计与实现为题,是对大学期间学到知识的一次实践运用,也是对自己大学四年学习成果的一次检验。 柏拉图:“游戏是一切幼子生活和能力跳跃需要而产生的有意识的模拟活动。”亚里士多德给游戏的定义是:“游戏是劳作后的休息和消遣,本身并带有任何目的性的一种行为活动。”可以说,游戏是一种一直存在的社会现象,有了人类就有了游戏,人类与游戏息息相关。游戏也随着人类的进步有了新的发展。 PC机刚开始普及的时候,游戏并不能被广泛接受。最主要的原因就是不能充分发挥PC机的性能,即游戏程序不能最大化使用PC机的硬件资源,导致PC机

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值