本文主要是介绍TankWar 单机(JAVA版)版本2.0.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 stubif (a == 3) {map[i][j] = a;map[i + 16][j] = a;map[i + 16][j + 16] = a;map[i][j + 16] = a;} elsemap[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);}
运行结果如下图:
这里可以看到子弹和坦克都是可以穿墙的 。我们都知道坦克不能穿透石头,水池,土墙等障碍物,子弹可以穿过水池,灌木丛等障碍物。
下一篇文章优化。
点击下载全部源码
这篇关于TankWar 单机(JAVA版)版本2.0.1 在地图中加入墙体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!