共计 2910 个字符,预计需要花费 8 分钟才能阅读完成。
前言
后面咱们实现了坦克的大战的单机版,从本篇开始升级成网络版
在此之前咱们须要修改上一版有余的中央之处
一、修改方向枚举
咱们目前的方向采纳的是 Tank 类里的枚举,然而咱们的使用者不止有坦克,还有炮筒等等
既然如此咱们应该把该枚举晋升至一个级别,改为一个公共的枚举类
public enum Direction {
// 定义方向
L, LU, U, RU, R, RD, D, LD, STOP;
}
因而咱们能够将坦克里的 Direction 去掉,改为枚举类的方向
class Tank{
// 将这个代码从 Tank 类中去掉
enum Direction {L, LU, U, RU, R, RD, D, LD, STOP}
// 省略其余关键性代码........
}
同时将子弹类里的 Tank.Direction 批改为 Direction 类即可
class Missle{
// 将这个代码从 Missle 类中去掉
Tank.Direction dir;
// 应用枚举类作为子弹的方向枚举
Direction dir;
public Missle(int x, int y, Direction dir) {
this.x = x;
this.y = y;
this.dir = dir;
}
public Missle(int x, int y,Direction dir, TankClient tc, boolean camp) {
this.x = x;
this.y = y;
this.dir = dir;
this.tc = tc;
this.camp = camp;
}
// 省略其余关键性代码........
}
同时在 TankClient 类中也要将不正确的中央修改过去
public class TankClient extends Frame {
// 将 Tank.Direction 代码去掉
Tank mytank = new Tank(50,50,this,true,Tank.Direction.STOP);
// 改为:Direction.STOP
Tank mytank = new Tank(50,50,this,true,Direction.STOP);
// 定义窗口办法
public void lauchFrame() {
// 营垒坏的坦克初始方向为:下
for (int i = 0; i < 10;i++){
// 将 Tank.Direction 代码去掉
tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Tank.Direction.D));
// 改为:Direction.D
tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Direction.D));
}
}
@Override
public void paint(Graphics g) {
// 如果寄存敌方坦克的容器里没有敌方坦克了
if(tanklist.size() <=0){
// 再次增加营垒为坏的坦克,并初始方向为:下
for (int i = 0; i < 5;i++){
//// 将 Tank.Direction 代码去掉
tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Tank.Direction.D));
//// 改为:Direction.D
tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Direction.D));
}
}
}
// 省略其余关键性代码........
}
二、批改坦克击中反馈
目前当咱们的子弹方块与坦克方块进行碰撞检测的时候,发现是间接在碰撞检测的办法里进行坦克血量的扣除
这就感觉怪怪的,每个人应该只做每个人的事件
当坦克被击中时进行扣血,应该是调用坦克类里的被击中办法进行扣血
这是一个问题之处,稍后进行解决
三、应用配置文件增加灵活性
目前咱们参数都是在代码中实现,比如说初始化的坦克个数、游戏窗口大小等等
若咱们须要改变的中央比拟多,则须要改变源代码,
那么思考一下:能不能只改变一个中央,即能够影响别的中央援用即可
接下来咱们应用配置文件实现这些事件
首先创立咱们配置文件 tankConfig
咱们能够在配置文件里编写初始化坦克的个数
# 初始化坦克个数
initTankConunt = 10
这时咱们在 TankClient 类中对配置文件进行援用并且读取它
public class TankClient extends Frame {
// 定义窗口办法
public void lauchFrame() {Properties properties = new Properties();
try {properties.load(this.getClass().getClassLoader().getResourceAsStream("tankConfig"));
} catch (IOException e) {e.printStackTrace();
}
int initTankCount = Integer.parseInt(properties.getProperty("initTankConunt"));
// 营垒坏的坦克初始方向为:下
for (int i = 0; i < initTankCount;i++){tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Direction.D));
}
// 省略其余关键性代码........
}
// 省略其余关键性代码........
}
这样咱们就实现了初始化坦克数量在配置文件里读取并应用
但咱们还有坦克的宽度、高度、以及其余的属性都须要在配置文件里进行配置这可怎么办?
咱们这时能够创立一个配置文件的类进行治理这些 key 值
public class PropertyMgr {static Properties properties = new Properties();
static {
try {properties.load(PropertyMgr.class.getClassLoader().getResourceAsStream("tankConfig"));
} catch (IOException e) {e.printStackTrace();
}
}
private PropertyMgr(){}
public static String getProperty(String key){return properties.getProperty(key);
}
}
而当咱们应用的时候,则能够调用对应的办法获取对应的 key 值即可
public class TankClient extends Frame {
// 定义窗口办法
public void lauchFrame() {int initTankCount = Integer.parseInt(PropertyMgr.getProperty("initTankConunt"));
// 营垒坏的坦克初始方向为:下
for (int i = 0; i < initTankCount;i++){tanklist.add(new Tank(50 + 40 * (i+1),50,this,false,Direction.D));
}
// 省略其余关键性代码........
}
// 省略其余关键性代码........
}
参考资料
尚学堂:坦克大战(马士兵老师)
正文完