package com.bigdata.tankbattle; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List; // game panel : 游戏面板 public class GamePanel extends JPanel { // 控制游戏是否结束 private static boolean GAME_OVER = false; public static final List<Tank> ENEMY_LIST = new ArrayList<>(); // 装墙 public static final List<Wall> WALL_LIST = new ArrayList<>(); /** * 方法 */ private Tank tank; // 敌军 // 创造数组 public static final List<Bullet> BULLET_LIST=new ArrayList<>(); // 常量 // 设置画板的宽度 public static final int PANEL_WIDTH = 1200; // 设置画板的高度 public static final int PANEL_HEIGHT = 600; // 颜色 public static final Color RED =new Color(0xFFFF0000, true); public static final Color BLACK =new Color(0x000000); // 字体 // 加粗 public static final Font BOLD =new Font("Microsoft Yahei",Font.BOLD,16); // 不加粗 public static final Font PLAIN =new Font("Microsoft Yahei",Font.PLAIN,16); //=============================最简单的单例=========================================== // 2、提供私有的静态的本类对象 private static final GamePanel gamePanel =new GamePanel(); // 保证都是new出来的都是一个画板 // 单例(在程序执行过程中,始终保持该类制备实例化一次): // 1、私有化构造器 private GamePanel(){ } // 3、提供共有的静态的获取本类的实例的方法 public static GamePanel getInstance(){ return gamePanel; } //================================================================================== // Ctrl + o // 重写,paint:画板 public Tank getTank() { return tank; } public void setTank(Tank tank) { this.tank = tank; } @Override public void paint(Graphics g) { super.paint(g); g.setColor(GamePanel.BLACK); g.setFont(GamePanel.PLAIN); // // 改字体颜色、加粗、大小 // g.setFont(new Font("Arial",Font.BOLD,16)); // g.setColor(new Color(0xff0000)); // // 写进入时显示的题目,题目出现位置的坐标 // g.drawString("Hello TankBattle!!!",100,100); // // // 画一个矩形,并且把颜色改成黑色 // g.setColor(new Color(0xf00)); // g.fillRect(200,200,50,50); // // 画子弹 // g.fillOval(250,210,20,20); // // 调用Tank里的数据 // // 坦克一号 // Tank tank = new Tank(Tank.InIT_X,Tank.InIT_Y,Tank.WIDTH,Tank.HEIGHT,Tank.WHEEL_WIDTH,Tank.BARREL_WIDTH,Tank.BARREL_HEIGHT); // tank.setDirection(Tank.UP); // // 显示出来 // tank.fill(g); // // // 坦克二号 // Tank tank1 = new Tank(); // tank1.setX(Tank.InIT_X*3); // tank1.setY(Tank.InIT_X*3); // tank1.setWidth(Tank.WIDTH); // tank1.setHeight(Tank.HEIGHT); // tank1.setWheelWidth(Tank.WHEEL_WIDTH); // tank1.setBarrelWidth(Tank.BARREL_WIDTH); // tank1.setBarrelHeight(Tank.BARREL_HEIGHT); // tank1.setDirection(Tank.DOWN); // // 显示出来 // tank1.fill(g); // // // 坦克二号 // Tank tank2 = new Tank(); // tank2.setX(Tank.InIT_X*5); // tank2.setY(Tank.InIT_X*4); // tank2.setWidth(Tank.WIDTH); // tank2.setHeight(Tank.HEIGHT); // tank2.setWheelWidth(Tank.WHEEL_WIDTH); // tank2.setBarrelWidth(Tank.BARREL_WIDTH); // tank2.setBarrelHeight(Tank.BARREL_HEIGHT); // tank2.setDirection(Tank.LEFT); // // 显示出来 // tank2.fill(g); // // // 坦克二号 // Tank tank3 = new Tank(); // tank3.setX(Tank.InIT_X*6); // tank3.setY(Tank.InIT_X*5); // tank3.setWidth(Tank.WIDTH); // tank3.setHeight(Tank.HEIGHT); // tank3.setWheelWidth(Tank.WHEEL_WIDTH); // tank3.setBarrelWidth(Tank.BARREL_WIDTH); // tank3.setBarrelHeight(Tank.BARREL_HEIGHT); // tank3.setDirection(Tank.RIGHT); // // 显示出来 // tank3.fill(g); tank.drawBloodBar(g); if (GAME_OVER){ g.drawString("游戏结束",560,200); // g.setFont(new Font("Arial",Font.BOLD,16)); return; } tank.fill(g); // 画自己的坦克 // 画敌军的坦克 for (Iterator<Tank> iterator=ENEMY_LIST.iterator();iterator.hasNext();){ Tank tank = iterator.next(); tank.fill(g); // 调用AI中的移动方法 AI.setMove(tank); // 调用AI中的改变方向方法 AI.changeDirection(tank); // 调用AI中的子弹方法 AI.shoot(tank); // 使敌军运动起来 tank.move(); tank.setMove(false); } // 画出子弹 for (Iterator<Bullet> iterator = BULLET_LIST.iterator();iterator.hasNext();){ Bullet nextBullet = iterator.next(); nextBullet.fill(g); nextBullet.move(); // 判断当子弹出界时,清除子弹 if (nextBullet.getX() <= 0 || nextBullet.getY() <= 0 || nextBullet.getX() >= GamePanel.PANEL_WIDTH || nextBullet.getY() >= GamePanel.PANEL_HEIGHT ){ iterator.remove(); } } // 画墙 for (Wall wall:WALL_LIST){ wall.fill(g); } hit(); } // 击中坦克 public void hit(){ List<Tank> tankList = new ArrayList<>(ENEMY_LIST); tankList.add(tank); for (Iterator<Bullet> bulletIterator=BULLET_LIST.iterator();bulletIterator.hasNext();){ Bullet bullet = bulletIterator.next(); int bulletMidX = bullet.getX()+bullet.getDiameter()/2; int bulletMidY = bullet.getY()+bullet.getDiameter()/2; for (Iterator<Tank> tankIterator=tankList.iterator();tankIterator.hasNext();){ Tank tank=tankIterator.next(); if (bullet.getTank() != tank && (!bullet.getTank().isSelf() && tank.isSelf()) || (bullet.getTank().isSelf() && !tank.isSelf())) { int tankMidX=tank.getX()+tank.getWidth()/2; int tankMidY =tank.getY()+tank.getHeight()/2; int hitRange=tank.getWidth()/2+bullet.getDiameter()/2; // Math.abs() :是取括号里的绝对值 if (Math.abs(bulletMidX-tankMidX)<hitRange && Math.abs(bulletMidY-tankMidY)<hitRange){ // 子弹击中坦克,子弹消失 bulletIterator.remove(); int blood = tank.getBlood(); if (!tank.isSelf()){ int score =this.tank.getScore(); this.tank.setScore(++score); } if (blood>1){ tank.setBlood(--blood); // 根据血量取画坦克 tank.resize(blood); }else { if (tank.isSelf()){ tank.setBlood(0); GAME_OVER=true; return; } tankIterator.remove(); ENEMY_LIST.remove(tank); } } } } } } // 屏幕刷新,死循环,一直刷新 public void refresh(){ Thread thread = new Thread(new Runnable() { @Override public void run() { for (;!GAME_OVER; ) { repaint(); // Alt +Enter // 刷新画布,等待1s刷新60次 try { Thread.sleep(1000 / 60); } catch (InterruptedException e) { e.printStackTrace(); } } repaint(); } }); thread.start(); } }
GamePanel类
最新推荐文章于 2024-03-18 09:39:22 发布