Java坦克大战 (七) 之图片版

本文介绍了Java实现的坦克大战V0.7图片版,包含坦克、子弹、爆炸的图片,以及使用配置文件和jar包。讲解了坦克大战的实现功能,如方向Enum类、坦克图片加载,以及 ProperMgr 和 Tank 类中加载资源的方法。提供源代码下载和配置文件、图片资源。
摘要由CSDN通过智能技术生成

本文来自:小易博客专栏。转载请注明出处:小易Smalle的博客_CSDN博客-Java,其他,微信开发领域博主

在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学完J2SE的小伙伴们一点启示!

如果嫌代码太长,可以在这里下载打包好的源代码哦!

坦克大战效果图:

坦克大战V0.7图片版实现功能:

1、将方向定义为一个Enum类写在一个文件里,修正坦克子弹的颜色
2、加入坦克、子弹、爆炸的图片
3、添加配置文件,并导出可运行的jar包

注意事项:

1、ProperMrg类中props.load(ProperMgr.class.getClassLoader().getResourceAsStream("config/tank.properties"));的解释:

(1)得到ProperMgr这个类编译后的class文件(ProperMgr.class)
(2)得到类装载器(getClassLoader())
(3)通过装载器得到源文件("config/tank.properties")的Stream(getResourceAsStream())
(4)加载(load)源文件

2、Tank类中获取图片tk.getImage(Tank.class.getClassLoader().getResource("images/tankL.gif"))的解释:

(1)Tank.class.getClassLoader()得到某个类(Tank)的装载器

(2)再获取文件getResource("文件路径")

(3)这样既不是绝对路径也不是相对路径,文件路径是根据装载器来获取相应的路径的。不用担心文件被移动后的路径问题(所有的文件最终会被编译到bin目录下)
 

坦克大战V0.7图片版源代码:

包com.exjava.tankWar中含有的类

TankClient类:

package com.exjava.tankWar;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.util.List; //java.awt包中也有个List,所以此处要导包明确
import java.util.ArrayList;
import java.util.Properties;

/**
 * 主要的类
 * @ClassName: TankClient
 * @Description: 坦克,子弹,爆炸,血块都在这里实例化
 * @author oldinaction
 * @date 2014年9月2日 下午4:15:44
 */
public class TankClient extends Frame {
	public static final int GAME_WIDTH = 800;
	public static final int GAME_HEIGHT = 600;

	Tank myTank = new Tank(350, 520, true, Direction.STOP, this); //我方坦克
	Wall w1 = new Wall(100, 300, 20, 100, this), w2 = new Wall(300, 250, 150, 20, this);
	Blood b = new Blood(this);
	
	List<Missile> missiles = new ArrayList<Missile>(); //定义一个集合来装子弹
	List<Explode> explodes = new ArrayList<Explode>();
	List<Tank> tanks = new ArrayList<Tank>();
	
	Image offScreenImage = null; //定义一个屏幕后的虚拟图片

	@Override
	public void paint(Graphics g) {
		if (tanks.size() <= 0) {
			for(int i = 0; i < Integer.parseInt(ProperMgr.getProperty("reProduceTank")); i++) {
				tanks.add(new Tank(50 + 40*(i+1), 50, false, Direction.D, this));
			}
		}
		
		g.drawString("missiles Count: " + missiles.size(), 10, 50); //用来记录missiles中子弹的个数
		g.drawString("explodes Count: " + explodes.size(), 10, 70);
		g.drawString("tanks Count: " + tanks.size(), 10, 90);
		g.drawString("myTank life: " + myTank.getLife(), 10, 110);
		
		for (int i = 0; i < missiles.size(); i++) { //遍历集合,把其中的子弹画出来
			Missile m = missiles.get(i);
			m.hitTanks(tanks);
			m.hitTank(myTank);
			m.hitWall(w1); //检测子弹是否撞墙
			m.hitWall(w2);
			m.drawMissile(g);
		}
		
		for (int i = 0; i < explodes.size(); i++) {
			Explode e = explodes.get(i);
			e.draw(g);
		}
		
		for (int i = 0; i < tanks.size(); i++) {
			Tank t = tanks.get(i);
			t.collidesWithWall(w1); //检测敌方坦克是否撞墙
			t.collidesWithWall(w2);
			t.collidesWithTanks(tanks);
			t.drawTank(g);
		}
		
		myTank.drawTank(g);
		myTank.eat(b);
		w1.draw(g);
		w2.draw(g);
		b.draw(g);
	}
	
	//利用双缓冲消除圆圈移动时屏幕的闪动
	@Override
	public void update(Graphics g) {
		if (offScreenImage == null) {
			offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT); //判断是为了避免每次重画时都给offScreenImage赋值
		}
		Graphics gOffScreen = offScreenImage.getGraphics(); //定义虚拟图片上的画笔gOffScreen
		Color c = gOffScreen.getColor();
		gOffScreen.setColor(Color.BLACK);
		gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT); //重画背景,如果没有这句则在屏幕上会保留圆圈的移动路径
		gOffScreen.setColor(c);
		paint(gOffScreen); //把圆圈画到虚拟图片上
		g.drawImage(offScreenImage, 0, 0, null); //再一次性把虚拟图片画到真实屏幕上,在真实屏幕上画则要用真实屏幕的画笔g
	}

	public void luanchFrame() {
		
		int initTankCount = Integer.parseInt(ProperMgr.getProperty("initTankCount"));
		
		for(int i = 0; i < initTankCount; i++) {
			tanks.add(new Tank(50 + 40*(i+1), 50, false, Direction.D, this));
		}
		
		this.setLocation(300, 50);
		this.setSize(GAME_WIDTH, GAME_HEIGHT);
		this.setTitle("坦克大战  - 游戏还存在Bug,欢迎大家试玩! - 帮助(复活:F2;放弹:1键;超级炮弹:空格) - By:小易 - QQ:381740148");
		this.setResizable(false); //不允许改变窗口大小
		this.addWindowListener(ne
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值