坦克大战源码:坦克大战
上一个版本知识回顾:我们已经可以将坦克、子弹换成了图片,然后可以画出爆炸的效果来,然后可以画出敌军的坦克,并且可以击败敌军坦克。
1.优化坦克、子弹的图片,并且加入背景音效
分为敌军坦克,和自己坦克两部分:
public class ResourceMgr {
public static BufferedImage goodTankL, goodTankU, goodTankR, goodTankD;
public static BufferedImage badTankL,badTankU,badTankR,badTankD;
public static BufferedImage bulletL,bulletU,bulletR,bulletD;
public static BufferedImage [] explodes = new BufferedImage[16];
static {
try {
//引入好的坦克图片
goodTankU = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/GoodTank1.png"));
goodTankL = ImageUtil.rotateImage(goodTankU, -90);
goodTankR = ImageUtil.rotateImage(goodTankU, 90);
goodTankD = ImageUtil.rotateImage(goodTankU, 180);
//引入敌军坦克图片
badTankU = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/BadTank1.png"));
badTankL = ImageUtil.rotateImage(badTankU, -90);
badTankR = ImageUtil.rotateImage(badTankU, 90);
badTankD = ImageUtil.rotateImage(badTankU, 180);
//引入bullet的图片
bulletU = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/bulletU.png"));
bulletL = ImageUtil.rotateImage(bulletU, -90);
bulletR = ImageUtil.rotateImage(bulletU, 90);
bulletD = ImageUtil.rotateImage(bulletU, 180);
for(int i=0 ;i<16;i++){
explodes [i] = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/e"+(i+1)+".gif"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.击败敌军坦克的时候,爆炸功能的实现
2.1加入到List中
List<Explode> explodes = new ArrayList<>();
然后在paint方法中:依次遍历:代码如下
for (int m = 0;m<explodes.size();m++){ explodes.get(m).paint(g); }
2.2显示爆炸的数量
g.drawString("爆炸的数量:"+explodes.size(),10,100);
调整爆炸的位置:
int eX = tank.getX() + tank.tankWidth/2 - Explode.WIDTH/2;
int eY = tank.getY() + tank.tankHeight/2 - Explode.HEIGHT/2;
tf.explodes.add(new Explode(eX, eY, tf));
3.敌人坦克简单智能化
3.1随机移动位置、随机发射子弹
思路:利用随机函数,private Random random = new Random();
在move方法里面写随机移动的方法。
if(this.group == Group.BAD && random.nextInt(100) > 95)
{
this.fire();
randomDir();
}
private void randomDir() {
this.dir = Dir.values()[random.nextInt(4)];
}
4.敌军坦克移动的边界检测
private void boundsCheck() {
if(this.x<4) x=4;
if(this.x>TankFrame.GAME_WIDTH) x = TankFrame.GAME_WIDTH - tankWidth;
if(this.y<30) y = 30;
if(this.y>TankFrame.GAME_HEIGHT) y = TankFrame.GAME_HEIGHT- tankHeight;
}
在Tank类的move方法中,调用边界检测方法就好了
5.加入配置文件,更加灵活的开发
config:
#tanks count at initialization
initTankCount=10
tankSpeed=5
bulletSpeed=10
GAME_WIDTH=1080
GAME_HEIGHT=720
读取配置文件的管理类:
public class PropertyMgr {
static Properties props = new Properties();
static {
try {
props.load(PropertyMgr.class.getClassLoader().getResourceAsStream("config"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object get(String key) {
if(props == null) return null;
return props.get(key);
}
public static void main(String[] args) {
System.out.println(PropertyMgr.get("initTankCount"));
}
}
以上四篇文章完成了坦克大战的第一版的开发,主要学习了面向对象的思想,后面的篇幅主要学习坦克大战中设计模式的实际运用。