在之前我记得我记录过e社海陆的制作,但是翻了下,好像找不到了,所以准备重新记录,这个东西思考了两三天,甚至于我不得不翻以前的代码,才完成了相关思路.故记录下来以防遗忘.
思路:
1. 如图,海陆边缘由周围六个边来决定.所以我们每次切换海陆时,都需要遍历格子周围的一圈坐标,判断他们的走向,并更新为相关显示
2.河流,河流的判断与海陆的判断思路基本一致, 但是如果照抄海陆,会出现三角形的情况(下图1)
我们需要额外判断,当格子的斜方向格子是河流的时候,垂直方向的河流方向判断应该为false,因为游戏中不可能出现三角形河流
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//自动海陆 public void checkCoast() { for (int i = 0; i < mapBins.size(); i++) { autoCoast(i, false); } } //生成海岸 // Gdx.app.log("autoCoast", "id:"+i+" coastId:"+c); public void autoCoast(int id, boolean ifAround) { List<Integer> tempIds = new ArrayList(); if (ifAround) { List<Integer> ids = getAroundIdById(id, 0, null); ids.add(id); for (Integer i : ids) { int c = getCoastId(i, tempIds); if (c != -1) { //mapBins.get(i).initGrid(); mapBins.get(i).setBackTile(2); mapBins.get(i).setBackIdx(c); } else { } } } else { /* * int s; if(id==7309) { s=1; } if (ifBorder(id)) { dealBorder(id); * } else */ { int c = getCoastId(id, tempIds); // Gdx.app.log("autoCoast", "id:"+id+" coastId:"+c); if (c != -1) { //mapBins.get(id).initGrid(); mapBins.get(id).setBackTile(2); mapBins.get(id).setBackIdx(c); /*mapBins.get(id).bmTerrain1Group = 1; mapBins.get(id).bmTerrain1Id = 0; mapBins.get(id).bmTerrain1X = 0; mapBins.get(id).bmTerrain1Y = 0; mapBins.get(id).bmDoodad1Group = 31; mapBins.get(id).bmDoodad1Id = c; mapBins.get(id).bmDoodad1X = 0; mapBins.get(id).bmDoodad1Y = 0; mapBins.get(id).bmDoodad2Group = 63; mapBins.get(id).bmDoodad2Id = 255; mapBins.get(id).bmDoodad2X = 0; mapBins.get(id).bmDoodad2Y = 0;*/ } } } //land /*if (mapBins.get(id).getBlockType() != 1) { if ((mapBins.get(id).getBackTile() == 2 )) { mapBins.get(id).setBackTile(0); mapBins.get(id).setBackIdx(0); } } else {//(mapBins.get(id).getBlockType() == 1) mapBins.get(id).setBackTile(1); mapBins.get(id).setBackIdx(0); }*/ } private int getCoastBorderId(int id, List<Integer> ids) { if (ids == null) { ids = new ArrayList<>(); } else { ids.clear(); } boolean t1 = ifSameByTypeInCoastBorder(id, 1); boolean t2 = ifSameByTypeInCoastBorder(id, 2); boolean t3 = ifSameByTypeInCoastBorder(id, 3); boolean t4 = ifSameByTypeInCoastBorder(id, 4); boolean t5 = ifSameByTypeInCoastBorder(id, 5); boolean t6 = ifSameByTypeInCoastBorder(id, 6); if (t1) { if (t2) { if (t3) { if (t4) { if (t5) { if (t6) { return 0; } else { return 60; } } else { if (t6) { return 56; } else { return 52; } } } else { if (t5) { if (t6) { return 48; } else { return 44; } } else { if (t6) { return 40; } else { return 36; } } } } else { if (t4) { if (t5) { if (t6) { return 62; } else { return 58; } } else { if (t6) { return 54; } else { return 50; } } } else { if (t5) { if (t6) { return 46; } else { return 42; } } else { if (t6) { return 38; } else { return 34; } } } } } else { if (t3) { if (t4) { if (t5) { if (t6) { return 63; } else { return 59; } } else { if (t6) { return 55; } else { return 51; } } } else { if (t5) { if (t6) { return 47; } else { return 43; } } else { if (t6) { return 39; } else { return 35; } } } } else { if (t4) { if (t5) { if (t6) { return 61; } else { return 57; } } else { if (t6) { return 53; } else { return 49; } } } else { if (t5) { if (t6) { return 45; } else { return 41; } } else { if (t6) { return 37; } else { return 33; } } } } } } else {//t1 if (t2) { if (t3) { if (t4) { if (t5) { if (t6) { return 32; } else { return 28; } } else { if (t6) { return 24; } else { return 20; } } } else { if (t5) { if (t6) { return 16; } else { return 12; } } else { if (t6) { return 8; } else { return 4; } } } } else { if (t4) { if (t5) { if (t6) { return 30; } else { return 26; } } else { if (t6) { return 22; } else { return 18; } } } else { if (t5) { if (t6) { return 14; } else { return 10; } } else { if (t6) { return 6; } else { return 2; } } } } } else { if (t3) { if (t4) { if (t5) { if (t6) { return 31; } else { return 27; } } else { if (t6) { return 23; } else { return 19; } } } else { if (t5) { if (t6) { return 15; } else { return 11; } } else { if (t6) { return 7; } else { return 3; } } } } else { if (t4) { if (t5) { if (t6) { return 29; } else { return 25; } } else { if (t6) { return 21; } else { return 17; } } } else { if (t5) { if (t6) { return 13; } else { return 9; } } else { if (t6) { return 5; } else { return 1; } } } } } } } public boolean ifSameByTypeInCoastBorder(int idA, int direct) { int idB = getIdInDirect(idA, direct); //Gdx.app.log("", "idA:"+idA+" idB:"+idB+" direct:"+direct+ " aG:"+getBlockType(idA)+ " bG:"+getBlockType(idB)); if (idB == -1) { return true; } else if (idB >= 0 && idB < mapBins.size() && mapBins.get(idA).getBlockType() == 1 && mapBins.get(idB).getBlockType() == 1) { return true; } else { return false; } } public boolean ifSameByTypeInRiverBorder(int idA, int direct) { int idB = getIdInDirect(idA, direct); //Gdx.app.log("", "idA:"+idA+" idB:"+idB+" direct:"+direct+ " aG:"+getBlockType(idA)+ " bG:"+getBlockType(idB)); if (idB == -1) { return true; } else if (idB >= 0 && idB < mapBins.size() && mapBins.get(idA).getBackTile() == 11 && mapBins.get(idB).getBackTile() == 11) { return true; } else { return false; } } public void autoRiver(int id, boolean ifAround) { List<Integer> tempIds = new ArrayList(); if (ifAround) { List<Integer> ids = getAroundIdById(id, 0, null); ids.add(id); for (Integer i : ids) { int c = getRiverId(i, tempIds); if (c != -999) { if(c==-1){ mapBins.get(i).setBackTile(11); mapBins.get(i).setBackIdx(63); }else{ mapBins.get(i).setBackTile(11); mapBins.get(i).setBackIdx(c); } } else { } } } else { /* * int s; if(id==7309) { s=1; } if (ifBorder(id)) { dealBorder(id); * } else */ { int c = getRiverId(id, tempIds); // Gdx.app.log("autoCoast", "id:"+id+" coastId:"+c); if (c != -999) { if(c==-1){ mapBins.get(id).setBackTile(11); mapBins.get(id).setBackIdx(63); }else{ mapBins.get(id).setBackTile(11); mapBins.get(id).setBackIdx(c); } } } } int c = getRiverId(id, tempIds); if (c != -999) { if(c==-1){ mapBins.get(id).setBackTile(11); mapBins.get(id).setBackIdx(63); }else{ mapBins.get(id).setBackTile(11); mapBins.get(id).setBackIdx(c); } } else { } } private int getCoastId(Integer id, List<Integer> ids) { if (mapBins.get(id).getBlockType() != 1) {// return -1; } int rs = getCoastBorderId(id, ids); return rs-1 ; } private int getRiverId(Integer id, List<Integer> ids) { if (mapBins.get(id).getBackTile() != 11) {// return -999; } int rs = getRiverBorderId(id, ids); //根据自己的坐标来进行偏移 return rs-1 ; } private int getRiverBorderId(int id, List<Integer> ids) { if (ids == null) { ids = new ArrayList<>(); } else { ids.clear(); } //左上1,上2,右上3,左下4,下5,右下6 boolean t1 = ifSameByTypeInRiverBorder(id, 1); boolean t2 = ifSameByTypeInRiverBorder(id, 2); boolean t3 = ifSameByTypeInRiverBorder(id, 3); boolean t4 = ifSameByTypeInRiverBorder(id, 4); boolean t5 = ifSameByTypeInRiverBorder(id, 5); boolean t6 = ifSameByTypeInRiverBorder(id, 6); if( (t4||t6)&&t5 ){ t5=false; } if( (t1||t3)&&t2 ){ t2=false; } if (t1) { if (t2) { if (t3) { if (t4) { if (t5) { if (t6) { return 0; } else { return 60; } } else { if (t6) { return 56; } else { return 52; } } } else { if (t5) { if (t6) { return 48; } else { return 44; } } else { if (t6) { return 40; } else { return 36; } } } } else { if (t4) { if (t5) { if (t6) { return 62; } else { return 58; } } else { if (t6) { return 54; } else { return 50; } } } else { if (t5) { if (t6) { return 46; } else { return 42; } } else { if (t6) { return 38; } else { return 34; } } } } } else { if (t3) { if (t4) { if (t5) { if (t6) { return 63; } else { return 59; } } else { if (t6) { return 55; } else { return 51; } } } else { if (t5) { if (t6) { return 47; } else { return 43; } } else { if (t6) { return 39; } else { return 35; } } } } else { if (t4) { if (t5) { if (t6) { return 61; } else { return 57; } } else { if (t6) { return 53; } else { return 49; } } } else { if (t5) { if (t6) { return 45; } else { return 41; } } else { if (t6) { return 37; } else { return 33; } } } } } } else {//t1 if (t2) { if (t3) { if (t4) { if (t5) { if (t6) { return 32; } else { return 28; } } else { if (t6) { return 24; } else { return 20; } } } else { if (t5) { if (t6) { return 16; } else { return 12; } } else { if (t6) { return 8; } else { return 4; } } } } else { if (t4) { if (t5) { if (t6) { return 30; } else { return 26; } } else { if (t6) { return 22; } else { return 18; } } } else { if (t5) { if (t6) { return 14; } else { return 10; } } else { if (t6) { return 6; } else { return 2; } } } } } else { if (t3) { if (t4) { if (t5) { if (t6) { return 31; } else { return 27; } } else { if (t6) { return 23; } else { return 19; } } } else { if (t5) { if (t6) { return 15; } else { return 11; } } else { if (t6) { return 7; } else { return 3; } } } } else { if (t4) { if (t5) { if (t6) { return 29; } else { return 25; } } else { if (t6) { return 21; } else { return 17; } } } else { if (t5) { if (t6) { return 13; } else { return 9; } } else { if (t6) { return 5; } else { return 1; } } } } } } }