TankWar 单机(JAVA版)版本2.0.1 在地图中加入墙体

110 篇文章 6 订阅
27 篇文章 1 订阅

在地图中加入障碍物,首先说说我的思路。

我把整个panel看作一个二维的数组,然后为这个二维数组赋不同的值。

二维数组的值表示我们地图所需的土墙  石头墙  灌木丛 水池等。

在加载地图时我们遍历地图集合,画出地图。

首先新建了一个Wall类

package tankWar;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

public class Wall {
	private int x;
	private int y;
	private int width;
	private int height;
	//id区分是哪种墙
	private int id;
	private static Toolkit tk=Toolkit.getDefaultToolkit();
	private static Image littlewalls,littlesteels,river,littlegrass,steels,grass;
	static
	{
		littlewalls=tk.getImage("image/walls.gif");
		littlesteels=tk.getImage("image/littlesteels.gif");
		river=tk.getImage("image/river.jpg");
		littlegrass=tk.getImage("image/grass.gif");
		steels = tk.getImage("Image/steels.gif");
		grass=tk.getImage("image/grass.gif");
	}
	public Wall() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Wall(int x, int y, int id) {
		super();
		this.x = x;
		this.y = y;
		this.id = id;
	}
	public void draw(Graphics g){
		//根据不同的id画不同的障碍物
		switch(id)
		{
		case 1:
			g.drawImage(grass, x, y, TankClient.tc);
			break;
		case 2:
			g.drawImage(steels, x, y, TankClient.tc);
			break;
		case 3:
			g.drawImage(littlewalls, x, y, TankClient.tc);
			break;
		case 4:
			g.drawImage(river, x, y, TankClient.tc);
			break;
		case 5:
			g.drawImage(littlegrass, x, y, TankClient.tc);
			break;
		case 6:
			g.drawImage(littlesteels, x, y, TankClient.tc);
			break;
		}
	}
}

必须的x,y坐标 draw方法肯定不能少 至于宽和高  在后面我们也会用到。

然后就是新建的Map类

package tankWar;

public class Map {
	//地图
	private int map[][] = new int[TankClient.SCREENWIDTH][TankClient.SCREENHEIGHT];
	//设置地图
	public int[][] getMap() {
		drawASurB(200, 193, 3, 1);
		drawASurB(200 - 32, 193 - 32, 3, 1);

		drawASurB(100, 280, 2, 1);

		drawASurB(280, 400, 2, 4);

		drawASurB(0, 180, 4, 1);

		drawASurB(501, 100, 4, 1);

		drawASurB(501 + 32, 100 - 32, 4, 1);

		drawASurB(300, 60, 2, 1);

		drawASurB(300, 260, 2, 1);

		drawASurB(670, 270, 2, 1);

		drawASurB(670, 170, 2, 1);

		drawASurB(550, 370, 2, 1);

		for (int i = 350; i < 450; i += 16) {
			map[i][350] = 2;
		}
		map[400 - 16][500] = 3;
		map[400][500] = 3;
		map[400 + 16][500] = 3;
		map[400 + 32][500] = 3;
		map[400 - 16][500 + 16] = 3;
		map[400 + 32][500 + 16] = 3;
		map[400 - 16][500 + 32] = 3;
		map[400 + 32][500 + 32] = 3;
		return map;
	}

	private void drawASurB(int i, int j, int a, int b) {
		// TODO Auto-generated method stub
		if (a == 3) {
			map[i][j] = a;
			map[i + 16][j] = a;
			map[i + 16][j + 16] = a;
			map[i][j + 16] = a;
		} else
			map[i][j] = a;
		map[i][j + 32] = b;
		if (i - 32 >= 0)
			map[i - 32][j] = b;
		map[i + 32][j] = b;
		map[i][j - 32] = b;
	}
}
map类 中的getMap方法就是返回一个二维数组 也就是地图

然后就是遍历二维数组 把地图元素放入地图集合

TankClient 类新增一个地图集合

//地图集合
	public static List<Wall> wallsList = new CopyOnWriteArrayList<Wall>();

遍历二维数组,将地图元素放入地图集合

Map m=new Map();
		int [][]tankMap=m.getMap();
		for(int i=0;i<tankMap.length;i++){
			for(int j=0;j<tankMap[i].length;j++){
				//如果某个坐标有值 也就是障碍物  放入地图集合
				if(tankMap[i][j]!=0){
					Wall wall=new Wall(i, j, tankMap[i][j]);
					wallsList.add(wall);
				}
			}
		}

之后就在paint方法里面绘制了

	for(Wall wall:wallsList){
				wall.draw(g);
			}


运行结果如下图:


这里可以看到子弹和坦克都是可以穿墙的  。我们都知道坦克不能穿透石头,水池,土墙等障碍物,子弹可以穿过水池,灌木丛等障碍物。

下一篇文章优化。

点击下载全部源码


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值