八连通填充算法

  最近做了个圈地的游戏,根据玩家行走路径和自己的领地区域圈出自己的新领地。自己在算法这方面比较薄弱,这次也趁机修炼了一波,写下自己的心得和感悟在这里。可能写的不好,希望看到的仅供参考,不足之处和错误之处多谢指正。

  八连通算法其实就是给定一个种子点,通过循环查找以自己为中心的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);  //递归调用

            }

     }

},

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值