“This is the 13th day of my participation in the First Challenge 2022. For details: First Challenge 2022”

❤️ Author’s home page: Xiao Xu Zhu

❤️ About the author: Hello everyone, I am Xiao Xu Zhu. Java field quality creator 🏆, CSDN blog expert 🏆, Huawei cloud enjoy expert 🏆, Nuggets of the year popular author 🏆, Ali Cloud expert blogger 🏆

❤️ technology live, the appreciation

❤️ like 👍 collect ⭐ look again, form a habit

preface

“Aircraft war -I” is a fusion of arcade, competitive and other elements of the classic shooting mobile tour. Gorgeous and exquisite game screen, super dazzle with a sense of skill special effects, super hot screen let you adrenaline burst, give you a full range of shock feeling, experience the infinite fun of flying combat.

The game is implemented in Java language, using Swing technology for interface processing, design ideas with object-oriented thought.

The main requirements

Players control a fighter, to eliminate all enemy aircraft for victory, some enemy opportunities to drop equipment, can not miss oh

The main design

1, use Swing library to do visual interface

2, mouse control fighter movement

3, with thread to achieve picture refresh.

4. Use stream to play music.

5. Create an airplane and place it under the scene.

6. Manage the movement of all planes, bullets and props in the scene

7. Manage all shots fired in the scene

8, generate enemy aircraft algorithm

9. Score calculation algorithm

Screenshot function

The game start

Combat Effect:

Code implementation

Start the class


public class Main {

    public static void main(String[] args) {
        // Create window
        JFrame frame = new JFrame("Plane wars.");
        / / add a JPanel
        Data.canvas = new Canvas(frame);
        frame.setContentPane(Data.canvas);
        // Initialize Data
        Data.init();
        // Set the icon
        frame.setIconImage(Load.image("ICON.png"));
        // Make the window visible
        frame.setVisible(true);
        // Get the height and width of the title bar
        Data.TITLE_BOX_HEIGHT = frame.getInsets().top;
        // Set the size
        frame.setSize(Data.WIDTH, Data.HEIGHT + Data.TITLE_BOX_HEIGHT);
        // The window size is fixed
        frame.setResizable(false);
        // The window is centered
        frame.setLocationRelativeTo(frame.getOwner());
        // End the program when the window closes
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Play background music
        Load.sound("background").loop(Clip.LOOP_CONTINUOUSLY); }}Copy the code

Core classes


public class Game implements Scenes {
    / / BOSS
    Aircraft player, boss;
    / / the enemy
    List<Aircraft> enemy;
    // Player bullet enemy bullet item list
    List<Bullet> bulletPlayer, bulletEnemy, bulletBuff;
    // Player dies when life < 0
    // int life = Data.LIFE;
    // Current level current score
    int checkpoint = 1, fraction = 0;
    // The flight direction of the aircraft, it needs to be noted here, when monitoring the button to control the movement of the aircraft, should not simply press the button once, because the keyboard does not release, the aircraft should keep moving in a certain direction until the button is released
    boolean left = false, right = false, down = false, up = false;
    // FPS, record the current frame number
    int fps = 0;
    // Indicate the x coordinate
    int tipsX = -1000;

    public Game(a) {
        // Create an airplane and place it below the scene. The player's Angle attribute will not be used
        player = new Aircraft(Data.playerAircraftImage, Data.playerDeathImage, Data.SPEED, 0, Data.WIDTH / 2 - 40, Data.HEIGHT - 100);
        // Set the plane collision point, because the game uses a rectangular collision detection, there will be a lot of errors, so manually set the collision rectangle, do not use the size of the picture, this collision coordinate is relative to the position of the picture coordinates
        player.upperLeft = new Point(15.15);
        player.lowerRight = new Point(75.75);
        // Initialize the list
        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;
        }
        // Draw a FPS + 1
        fps++;
        // The plane moves
        move();
        // The bullet is fired
        attack();
        // Enemy planes are generated
        generate();
        // Invalid object is destroyed
        remove();
        // Draw the background
        Data.background.show(g);
        // Draw our aircraft
        if(player ! =null)
            player.draw(g);
        / / draw the BOSS
        if(boss ! =null) boss.draw(g);
        // Draw enemy aircraft
        for (Aircraft a : enemy)
            a.draw(g);
        // Draw I fire bullets
        for (Bullet b : bulletPlayer)
            b.draw(g);
        // Draw enemy bullets
        for (Bullet b : bulletEnemy)
            b.draw(g);
        // Draw props
        for (Bullet d : bulletBuff)
            d.draw(g);

        g.drawString("Score:" + 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);
        }
        // Draw a picture of the boss
        if (tipsX > -900 && tipsX < 900) {
            g.drawImage(Data.tips, tipsX, 200.null); }}// Manage the movement of all planes, bullets and items in the scene
    void move(a) {
        if(player ! =null) {
            // This coordinate is used for positioning enemy bullets
            Data.x = player.x;
            Data.y = player.y;
            // The plane moves up, which also limits the plane's range so that it does not fly off the screen
            if (up) player.move(0, -player.speed);
            if (player.y < 0) player.y = 0;
            // The plane moves down
            if (down) player.move(0, player.speed);
            if (player.y > Data.HEIGHT - player.height) player.y = Data.HEIGHT - player.height;
            // The plane moved to the left
            if (left) player.move(-player.speed, 0);
            if (player.x < 0) player.x = 0;
            // The plane moves to the right
            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();
        // The movement of our bullets
        for (Bullet bullet : bulletPlayer)
            bullet.move();
        // Enemy bullet movement
        for (Bullet bullet : bulletEnemy)
            bullet.move();
        // Item movement
        for (Bullet bullet : bulletBuff)
            bullet.move();
        // Local aircraft movement, including BOSS
        for (Aircraft air : enemy)
            air.move();
        / / move BUFF
        for (Bullet b : bulletBuff)
            b.move();
    }

    void remove(a) {
        Random random = new Random();
        // Bullets destroyed
        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++;
        }
        // Enemy destroy
        for (int i = 0; i < enemy.size(); ) {
            if (enemy.get(i).isRemove()) {
                // Generate items
                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("Death");
                // Kill an enemy for 1 point, not so much bells and whistles
                fraction += 10;
                if (fraction / 100 == checkpoint) {
                    boss = new Boss2();
                    checkpoint += 1;
                    Load.playSound("Warning");
                    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) {
            // 4 buffs are dropped when bosses die
            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;
        // Detect our bullet collision
        for (int i = 0; i < bulletPlayer.size(); i++) {
            Point point = bulletPlayer.get(i).getPoint();
            if (bulletPlayer.get(i).buffetIndex > 1) continue;
            // Check if the bullet hits the 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("Hit");
                    }
                    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("Hit");
                    }
                    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;
        // Detect enemy bullet collision
        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(); }}}}/ / eat 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); }}}// Collisions between aircraft
        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("Failure"); death(); }}}}// Manage all shots fired in the scene
    void attack(a) {
        // Our aircraft fires at 3 frames
        if(player ! =null && player.hp > 0) {
            if(! player.isRemove() && fps %3= =0)
                bulletPlayer.addAll(Arrays.asList(player.attack()));
        }
        // Enemy planes fired bullets
        if (fps % 5= =0)
            for (Aircraft em : enemy)
                bulletEnemy.addAll(Arrays.asList(em.attack()));
        // Boss fires bullets
        if(boss ! =null) bulletEnemy.addAll(Arrays.asList(boss.attack()));
    }

    // Generate enemy aircraft
    void generate(a) {
        // Bosses do not spawn small planes
        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(a) {
        new Thread(() ->{
            try {
                player = null;
                Thread.sleep(3000);
                Data.canvas.switchScenes("Home");
            } catch(InterruptedException e) { e.printStackTrace(); } }).start(); }}Copy the code

The core algorithm


@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;// Rotation speed
	int movementSpeed=3;// Move speed
	int NormalSpeed=3;
	int attackSpeed=3;// Attack speed
	int activeCounter;
	int attackCounter;
	int defenceCounter=0;
	int perfectDefenceTime=0;// The remaining time to complete a block (starting the block 0.1 seconds before the enemy attacks reduces the energy cost of the block by 1/10)
	int defenceCooldown=0;// Block cooldown this prevents the player from frantically starting/stopping blocks
	int playerWidth=50;
	int playerHeight=50;
	int gamePhaseTimeCounter=0;
	int gamePhaseTimeCounter2=0;
	int endPhase=6*4;// The stage in which the game is completed
	/* Level 1 0 * Level 2 6 * */
	int gamePhase=0;// Stage at the beginning of the game (normal players should start from level 1, stage should start from 0)
	
	String humanIconContorler;
	
	JPanel viewMap;
	
	// Players have two labels, one above and one below the 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;// The dark scene at the venue change
	JLabel placeChangeBlack_1;// Black screen when changing venue (used for property bar)

	
	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;// Queue Pointers 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; / / test
		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);
		
		// It's on the 100th floor
		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("");/ / avatar
		lblNewLabel.setBounds(0.0.50.50);
		lblNewLabel.setIcon(new ImageIcon("resource/HPBarHead.png"));
		panel_1.add(lblNewLabel);
		
		lblNewLabel_2B = new JLabel("");/ / HP
		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("");/ / physical characters
		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("");/ / the blood
		lblNewLabel_2.setBounds(50.0.200.25);
		lblNewLabel_2.setIcon(new ImageIcon("resource/RedBar.png"));
		panel_1.add(lblNewLabel_2);
		
		lblNewLabel_3 = new JLabel("");/ / manual
		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("");// Health bar physical bar background
		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("Black", 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("Black", 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("");// Player tryingFace indicator (temporarily disabled)
		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);
		
		
		/ / the 99th floor
		/ / title
		TitleLabelT = new JLabel("");
		TitleLabelT.setFont(new Font("Black", Font.PLAIN, 45));
		TitleLabelT.setHorizontalAlignment(SwingConstants.CENTER);
		TitleLabelT.setBounds(100.50.584.50);
		TitleLabelT.setVisible(true);
		panel.add(TitleLabelT);
		/ / subtitle
		SubTitleLabelT = new JLabel("");
		SubTitleLabelT.setFont(new Font("Black", Font.PLAIN, 25));
		SubTitleLabelT.setHorizontalAlignment(SwingConstants.CENTER);
		SubTitleLabelT.setBounds(100.100.584.50);
		SubTitleLabelT.setVisible(true);
		panel.add(SubTitleLabelT);
		
		// Pre-created particle effect Label, layer 6
		for(int i=0; i<maxParCount; ++i) { parLabel[i]=new JLabel("");
			panel.add(parLabel[i]);
		}
		
		// The player above the boss, tier 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, level 4.5
		bossLabel = new JLabel("");
		panel.add(bossLabel);

		// The player below the boss, tier 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]);
		
		// Player oriented indicator, level 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);
		
		// Pre-create emitter Label, layer 2
		for(int i=0; i<maxProCount; ++i) { proLabel[i]=new JLabel("");
			panel.add(proLabel[i]);
		}
		
		// Create ground arrow, layer 1.5
		groundArrayLabel=new JLabel("");
		groundArrayLabel.setBounds(709.156.50.50);
		groundArrayLabel.setIcon(new ImageIcon("resource/groundArray.png"));
		groundArrayLabel.setVisible(false);
		panel.add(groundArrayLabel);
		
		// Create ground Label, layer 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();		
	}
	
	// Emission correlation
	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(a)
	{
		proLink tempNode=proHead;
		while(tempNode.next! =null) { tempNode=tempNode.next; tempNode.data.doFly(); }}// End of emitter correlation
	
	// Particle effects are related
	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(a)
	{
		parLink tempNode=parHead;
		while(tempNode.next! =null) { tempNode=tempNode.next; tempNode.data.doFly(); }}public void checkPlayerLocation(a)// Check the player's position and pull back to the map if it is off the map
	{
		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(a)// Execute 50 times per second
	{
		if(attackCounter==0&&defenceCounter==0)
			playingRole.regenerate();
		if(playingRole.HP>0)
		{
			// Refresh the health bar
			lblNewLabel_3.setBounds(50.25, (int) (200*playingRole.energy/playingRole.MaxEnergy), 25);
			lblNewLabel_3B.setText(""+ (int)playingRole.energy+"/"+ (int)playingRole.MaxEnergy);
			// Refresh health bar
			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("Start the console...");
				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)// Initialize the first level
				{
					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)// Enter the arrow
					{
						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);
				// Need to modify start
				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"));
				}
				// Need to modify the end
				playerX=50;
				playerY=200;
				// Need to modify start
				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);
				// Need to modify the end
				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);// Need to be modified
				placeChangeBlack.setVisible(false);
				placeChangeBlack_1.setVisible(false);
				gamePhaseTimeCounter=0; ++gamePhase; }}if(gamePhase==20)
		{
			gamePhaseTimeCounter=0;
			boss=new Mob(4,bossLabel,thisMenu);// Need to be modified
			bossLabel.setBounds(375.175.100.100);// Need to be modified
			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;
				// Need to modify start
				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);
				// It needs to be modifiedstartQuestCompleteBGM(); 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(); }}/ / refresh 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);
		}
		
		// The player tries to be oriented
		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))// Make a turn
		{
			double d_angle=(playingRole.facingAngle-playingRole.tryingFace+360) %360;//0-180 is clockwise
			if(d_angle<=rotationSpeed||d_angle>=360-rotationSpeed)// Rotate
			{
				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))// Make a move
		{
			++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 toggle to move picture once
			{
				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)// Launch an attack
		{
			attackCounter=1;
		}
		
		if(attackCounter>0&&attackCounter<=8*attackSpeed)// Under attack
		{
			++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)// Complete the attack
		{
			playingRole.costEnergy(10);
			fatherMenu.startNewSound("sweep"+Calculator.randomInt(1.3) +".wav".false.1);
			playingRole.doAttack();
		}
		if(attackCounter>8*attackSpeed)// End hard straight
		{
			attackCounter=0;
		}
		
		
		if(defenceCooldown>0)
		{
			--defenceCooldown;
		}
		if(perfectDefenceTime>0)
		{
			--perfectDefenceTime;
		}
		if(pressingK==1&&attackCounter==0&&defenceCounter==0&&defenceCooldown==0)// Activate the defense
		{
			perfectDefenceTime=5;
			defenceCounter=1;
			playingRole.defenceStance=true;
			playingRole.isBlocked=false;
		}
		if(defenceCounter==1)
		{
			if(pressingK==0)// Unblock
			{
				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)// The player should have covered the boss, but he didn't
			{
				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)// The boss was supposed to cover the player, but it didn't
			{
				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(a)
	{
		if(battleBGM! =null)
			battleBGM.endMusic();
	}
	
	public void startQuestCompleteBGM(a)
	{
		if(questCompleteBGM! =null)
			questCompleteBGM.endMusic();
		questCompleteBGM=new CMusic("QuestComplete.wav".false.1); questCompleteBGM.start(); }}Copy the code

conclusion

Through this “Aircraft War -I” game implementation, let me have a further understanding of swing related knowledge, the Language of Java has a deeper understanding than before.

Basic Java syntax, such as data types, operators, program flow control, and arrays, is better understood. Java is the core of the core object oriented thought, for this concept, finally realized some.

The source code for

After clicking “like” and following the blogger, the private blogger will get it for free