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

作者:小虚竹and掘金 时间:2023-07-30 15:45:22 

前言

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

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

主要需求

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

主要设计

1、 用Swing库做可视化界面

2、鼠标控制战斗机移动

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

4、用流实现音乐播放。

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

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

7、管理场景所有的 * 的发射

8、生成敌方飞机算法

9、分数计算算法

功能截图

游戏开始

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

战斗效果:

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

代码实现

启动类


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();
}

}

来源:https://juejin.cn/post/7062567477263204383

标签:Java,飞机大战
0
投稿

猜你喜欢

  • C#如何实现调取钉钉考勤接口的功能

    2023-09-14 17:31:47
  • Java如何将字符串String转换为整型Int

    2023-11-10 21:40:19
  • java线程池的四种创建方式详细分析

    2022-10-20 22:32:41
  • idea统计代码行数Statistic的步骤详解

    2021-12-06 13:32:55
  • Android车载多媒体开发MediaSession框架示例详解

    2022-08-10 19:49:20
  • Android应用更新之自动检测版本及自动升级

    2023-12-27 07:23:01
  • Java安全-ClassLoader

    2023-08-18 02:12:21
  • C#利用Random得随机数求均值、方差、正态分布的方法

    2022-08-28 14:26:37
  • 细说C#中的枚举:转换、标志和属性

    2021-07-10 06:01:05
  • Java实现简易俄罗斯方块

    2022-12-18 14:07:58
  • SpringMVC实现文件上传和下载功能

    2022-10-03 18:22:27
  • java读取解析xml文件实例

    2023-01-04 05:52:40
  • 重写Java中的equals方法介绍

    2023-06-24 00:30:26
  • android中DatePicker和TimePicker的使用方法详解

    2021-08-28 14:45:13
  • 为Xamarin.Forms的导航栏增加搜索功能

    2022-01-28 18:38:58
  • j2ee之AJAX二级联动效果

    2021-09-13 10:06:58
  • SpringBoot+WebSocket实现即时通讯的方法详解

    2021-07-24 15:48:49
  • Android编程实现滑动按钮功能详解

    2022-04-14 04:58:39
  • Android设置Activity背景为透明style的简单方法(必看)

    2021-08-13 14:20:18
  • Android中Activity的四种启动模式和onNewIntent()

    2022-09-05 23:15:02
  • asp之家 软件编程 m.aspxhome.com