package cn.hzmslx;
/* TankWar 2.9
* ================0.1版=========================
* 显示出800*600窗口
* ================0.2版=========================
* 添加窗口关闭事件,同时设置窗口大小无法改变
* ================0.3版=========================
* 画出坦克身体,并将其显示在窗口里面,并在每次打开窗口时更新
* ================0.4版=========================
* 添加一个线程,使坦克在窗口里面移动
* ================0.41版========================
* 利用双缓冲技术消除闪屏现象的bug
* ================0.5版=========================
* 为以后的改动打下了坚实的基础,把所有的不变量全部改成常量
* ================0.6版=========================
* 添加了键盘监听,是坦克可以上下左右移动了
* ================0.7版=========================
* 把坦克包装成了类,更加体现面向对象的思考方法,产生坦克更加容易
* ================0.8版=========================
* 对坦克类做出重大修改,同时让坦克的运动方向从四个变为了八个
* ================0.9版=========================
* 修正坦克移动两次就停止移动的bug
* ================1.0版=========================
* 给坦克添加了发射炮弹的功能,让游戏更有真实感
* ================1.1版=========================
* 添加对发射炮弹键Ctrl的监听,炮弹的飞行方向由坦克的前进方向决定
* ================1.2版=========================
* 修正坦克不动炮弹也不能飞出的bug,添加炮筒,坦克变得更加真实
* 炮弹的飞行方向变为炮筒的方向
* ================1.3版=========================
* 添加多发炮弹机制,一次性可以打出很多发炮弹,不会像以前那样打一下
* 就会把刚才的炮弹抹掉
* ===============1.4版==========================
* 解决炮弹出界不消亡问题,和坦克出界问题,杜绝了玩游戏消耗内存
* 巨大的问题
* ===============1.5版==========================
* 画出了敌人的坦克,并用不同的颜色和自己的坦克进行区分
* ===============1.6版==========================
* 添加一个子弹击中一个坦克,且解决再次发子弹不再次击中的问题
* ===============1.7版==========================
* 对背景颜色进行了调整,添加了爆炸类
* ===============1.8版==========================
* 添加坦克列表,不再只是一辆敌人坦克,而是一个列表
* ===============1.9版==========================
* 添加简单的人工智能,让坦克动起来
* ===============2.0版==========================
* 添加墙,自己的坦克可以穿墙,别人的坦克穿不了,不过打到墙
* 也会发生爆炸,让游戏变得更有真是感
* ===============2.1版==========================
* 坦克不能再互相穿越,游戏得到进一步修正,更加具有真实感
* ===============2.2版==========================
* 添加超级炮弹功能,可以向八个方向打出导弹
* A:八向导弹
* S:发射两枚穿甲弹
* ==============2.3版===========================
* 添加生命值,主战坦克不是一击就死了了
* ==============2.4版===========================
* 添加血的滑条,游戏得到了进一步的完善
* ==============2.5版 初级版=====================
* 程序大概写完成了,在这个版本里面添加了按F2自己复活了敌人打
* 光了自己添加的功能,以后的版本将添加Boss功能
* ==============2.6-2.7合集=====================
* 添加过关关卡,一共分为四关,每过一关坦克的攻击力都会提高
* ==============2.8版===========================
* 把爆炸的变为了图片,让整个程序更加生动
* ==============2.9版===========================
* 添加坦克的图片和炮弹图片,并对加载代码进行了高精度操作
* 添加了配置文件,管理初始的坦克数量(添加一个静态的类)
*
*/
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
/**
* 本类用于显示坦克大战的主窗口
*
* @author hzmslx
*
*/
public class TankClient extends Frame {
public static long killTanks = 0; // 保存杀死敌人坦克数量
public static final int GAME_WIDTH = 900; // 游戏窗口的宽
public static final int GAME_HEIGHT = 650; // 游戏窗口的高
public static final int TANK_WIDTH = 30; // 坦克的宽
public static final int TANK_HEIGHT = 30; // 坦克的高
public static int killCount = 0;
public static int gates = 0; //保存关数
public static int sleepTime = 25; //屏幕刷新的时间
Tank myTank = new Tank(50, 50, true, Direction.STOP, this); // 构造一个坦克
// Tank enemyTank = new Tank(40,40,false,this);
List<Tank> enemyTanks = new ArrayList<Tank>();
List<Boss> bossList = new ArrayList<Boss>(); //保存boss的引用
List<Boss> goodBoss = new ArrayList<Boss>();
Wall w1 = new Wall(100, 200, 50, 300, this);
Wall w2 = new Wall(300, 100, 300, 30, this);
River r1 = new River(180,200,600,30,this);
// Explode ex = new Explode(80,80,this);
// Tank myTank2 = new Tank(70,70,true,this);
List<ExplodeNew> epList = new ArrayList<ExplodeNew>(); // 保存爆炸
List<Blood> bls = new ArrayList<Blood>();
List<Missile> missileList = new ArrayList<Missile>(); // 保存炮弹的引用
Image offScreenImage = null; // 用于双缓冲,相当于是窗口背后的窗口
PaintThread pt = new PaintThread();
Thread t = new Thread(pt);
// MenuBar mb = new MenuBar();
/** 默认构造方法 */
public TankClient() {
}
/** 构造一个有名字的窗口 */
public TankClient(String Name) {
super(Name);
}
public static void main(String[] args) {
TankClient tc = new TankClient("TankWar");
tc.loadFrame();
}
public void toGate(TollGate tg) { // 通关方法
switch (tg) {
case GATE_ONE:
for (int i = 0; i < Integer.parseInt(PropertiesMake.getProperties("Gate_One_TanksCount")); i++) {
enemyTanks.add(new Tank(60 + (35 * (i + 5)), 500, false,
Direction.RIGHT, this));
Tank.randomFire = 35; // 增大炮火程度
}
if (bls.size() == 0) {
Blood b1 = new Blood();
bls.add(b1);
}
break;
case GATE_TWO:
for (int i = 0; i < Integer.parseInt(PropertiesMake.getProperties("Gate_Two_TanksCount")); i++) {
enemyTanks.add(new Tank(60 + (35 * (i + 5)) , 500 , false,
Direction.RIGHT, this));
Tank.randomFire = 30;
}
if (bls.size() == 0) {
Blood b1 = new Blood();
bls.add(b1);
}
break;
case GATE_THREE:
for (int i = 0; i < Integer.parseInt(PropertiesMake.getProperties("Gate_Three_TanksCount")); i++) {
enemyTanks.add(new Tank(60 + (35 * (i + 5)), 500, false,
Direction.RIGHT, this));
Tank.randomFire = 20;
}
Blood b = new Blood();
bls.add(b);
break;
case GATE_FOUR:
for (int i = 0; i < Integer.parseInt(PropertiesMake.getProperties("Gate_Four_TanksCount")); i++) {
enemyTanks.add(new Tank(60 + (35 * (i + 5)), 500, false,
Direction.RIGHT, this));
Tank.randomFire = 10;
}
if (bls.size() == 0) {
Blood b1 = new Blood();
bls.add(b1);
}
break;
case GATE_BOSS_ONE:
MrLiuBoss mb = new MrLiuBoss(this,Direction.LEFT,650,500,Color.GREEN,false);
bossList.add(mb);
if (bls.size() == 0) {
Blood b1 = new Blood();
bls.add(b1);
}
break;
case GATE_FIVE:
for (int i = 0; i < 25; i++) {
enemyTanks.add(new Tank(60 + (35 * (i + 5)), 500, false,
Direction.RIGHT, this));
Tank.randomFire = 20;
}
if (bls.size() == 0) {
Blood b1 = new Blood();
bls.add(b1);
}
break;
case GATE_BOSS_TWO:
for(int i = 0; i < 5; i++) {
enemyTanks.add(new Tank(60 + (35 * (i + 5)), 500, false,
Direction.RIGHT, this));
Tank.randomFire = 30;
}
MrLiuBoss mb2 = new MrLiuBoss(this,Direction.LEFT,650,500,Color.ORANGE,false);
bossList.add(mb2);
if (bls.size() == 0) {
Blood b1 = new Blood();
bls.add(b1);
}
break;
case GATE_BOSS_TWOBOSS:
MrLiuBoss mb3 = new MrLiuBoss(this,Direction.LEFT,650,500,Color.ORANGE,false);
MrLiuBoss mb4 = new MrLiuBoss(this,Direction.LEFT,650,500,Color.ORANGE,false);
bossList.add(mb3);
bossList.add(mb4);
MrLiuBoss goodB = new MrLiuBoss(this,Direction.LEFT,500,400,Color.RED,true);
goodBoss.add(goodB);
if (bls.size() == 0) {
Blood b1 = new Blood();
bls.add(b1);
}
break;
case GATE_BOSS_F