最近做了个圈地的游戏,根据玩家行走路径和自己的领地区域圈出自己的新领地。自己在算法这方面比较薄弱,这次也趁机修炼了一波,写下自己的心得和感悟在这里。可能写的不好,希望看到的仅供参考,不足之处和错误之处多谢指正。
八连通算法其实就是给定一个种子点,通过循环查找以自己为中心的3*3其他八个点,满足要求的就填充自己的颜色,并调用该点旁边的八个点,不满足就跳出,循环往复。八连通算法是相对简单的一种算法,不过它的缺点也很明显,那就是递归导致效率低。而且必须要有种子。对于给定行走路径的圈地来说,种子点需要确定,递归导致的卡慢使得圈地的瞬间比较卡顿。所以并没有选择这种算法,不过这里也标记一下八连通算法。
将八个方向基于种子节点的坐标存入数组,等下循环的时候使用
var direction_8 = [ cc.v2(-1, 0), cc.v2(-1, 1), cc.v2(0, 1), cc.v2(1, 1), cc.v2(1, 0), cc.v2(1, -1), cc.v2(0, -1), cc.v2(-1, -1) ];
填充方法:
areaFill(x, y) {
let self = this;
if(self.tiledLayer.getTileGIDAt(x, y) == 1){ //我这里使用的是瓦片地图 根据瓦片的gid值判定是不是自己的区域
self.tiledLayer.setTileGID(2,x, y);
for(let i = 0; i < direction_8.length; i++){
self.FloodSeedFill(x + direction_8[i].x,y + direction_8[i].y); //递归调用
}
}
},