最近做了一个圈地的游戏,整个游戏的核心就是圈地算法的实现,对于算法这一块我真的是不擅长的很,尝试了八连通算法,但是太卡了,而且限制也比较多,不能实现。又尝试了计算机图形学中的X扫描算法和Y扫描算法,可是在某些情况下,圈地区域会漏掉,因为有些时候,圈的地是不能围成一个圈的,也就实现不到扫描算法。可能是自己才疏学浅,想不到这特殊情况下该如何处理,多番尝试也还是会有偶现的bug。最后灵光闪现想了个比较蠢的方法,就是相对而言计算量有点大,但是却能够实现预期的效果。在这里标记一下,如果能帮助到人是再好不过,不能的话我也只是做个记录。

在圈地游戏中我选择的是tiledMap。tiledMap还是很多坑的,比如说我用的tiledMap版本1.1.5。creator版本用的是1.9.2。在tiledMap中,添加图块,选中图块的渲染到层上的时候,把鼠标停在该图块上左下角就会显示图块的坐标加gid值,但是这个gid值和creator中的gid值却不一样,就是说tiledMap的gid值是从0开始的,但是creator中却始终比tiledMap的gid值大1,也就是说在creator设置gid值为1 的时候,显示的是你图块id=0的纹理。第二点就是切图的时候会有白线闪烁,很烦,在红米手机上尤为显著,某些手机上却不存在这样的情况。解决办法就是把单个图块画的大一点,中间留上缝隙。这里官方论坛提供的方法可以参考一下,也许解决了呢。我反正没解决,大概有那么一点用吧。

cc.macro.FIX_ARTIFACTS_BY_STRECHING_TEXEL = 1; //更改libcocos2d库的ccConfig.h的宏,

cc.director.setProjection(cc.Director.PROJECTION_2D);

cc.macro.ENABLE_WEBGL_ANTIALIAS = false;

cc.loader.loadRes("res", cc.Texture2D,function (err, tex) {

tex.setAliasTexParameters();

});

圈地算法的实现呢,我的思路是这样的,首先记录自己的领地上下左右四个方向的最大值。在离开自己领地的时候,记录走过的路径值,然后回到自己的领地的时候,首先将自己走过的路径设为自己的领地,然后更新领地的四个方向最大值,遍历自己的领地,如果当前领地区域内有不是自己的领地的格子,查找这个格子四个方向是否有自己领地直到尽头,找到就跳出。如果四个方向都有的话就说明被包围了,然后就肯定是被圈到了。如此循环直到遍历结束。遍历tiledMap的gid值是很卡的,有兴趣可以去看一下源码实现。我这样的方法,计算量相对比较大,在电脑上确实一点都不卡,但是在手机上,就显得有点卡顿了。所以我做了一个分帧处理的操作,如果循环次数过多,就延时0.01再去计算,这样将压力平均的分担开来,也就不会卡顿了。视觉上也不会有不好的体验。下边是我的实现代码,仅供参考。

myFillMethod(){
        let self = this;
        //更新领地边界值
        for(var i = 0; i <self._myWalkList.length;i++){
            if(self._myWalkList[i].x > self._myCityMaxX){
                self._myCityMaxX = self._myWalkList[i].x;
            }
            if(self._myWalkList[i].x < self._myCityMinX){
                self._myCityMinX = self._myWalkList[i].x;
            }
            if(self._myWalkList[i].y > self._myCityMaxY){
                self._myCityMaxY = self._myWalkList[i].y;
            }
            if(self._myWalkList[i].y < self._myCityMinY){
                self._myCityMinY = self._myWalkList[i].y;
            }
        }
        //循环补位  封锁的区域 如果有不是自己的领地  扫描该点上下左右是否都有自己的领地  是的话设为自己的领地
        self.forMyFillDelay(self._myCityMinY,self._myCityMaxY);
    },

forMyFillDelay(MinX,MaxX){
        let computerTime = 0;
        let self = this;
        for(var a = MinX;a < MaxX;a++){
            computerTime ++;
            if(computerTime > 1000){
                self.emptyNode.runAction(cc.sequence(   //分帧处理循环  单次超过1000  延时0.01
                    cc.delayTime(0.01),
                    cc.callFunc(function(){
                        self.forMyFillDelay(a,self._myCityMaxY)           
                    },self),
                ));
                return;
            }
            let partMaxX = self._myCityMaxX;
            let partMinX = self._myCityMinX;
            for(let vi = partMinX;vi<partMaxX;vi++){
                computerTime ++;
                if(self.tiledLayer.getTileGIDAt(vi,a) == self._myCityAreaGid){
                    partMinX = vi;
                    break;
                }
            }
            for(let vj = partMaxX;vj>partMinX;vj--){
                computerTime ++;
                if(self.tiledLayer.getTileGIDAt(vj,a) == self._myCityAreaGid){
                    partMaxX = vj;
                    break;
                }
            }
            for(var b = partMinX;b<partMaxX;b++){
                computerTime ++;
                if(self.tiledLayer.getTileGIDAt(b, a) != self._myCityAreaGid){
                    let xToLeft = false;
                    let xToRight = false;
                    let yToUp = false;
                    let yToDown = false;
                    
                    for(var ia = b;ia < self._myMapMaxX;ia++){
                        computerTime ++;
                        if (self.tiledLayer.getTileGIDAt(ia, a) == self._myCityAreaGid){
                            xToRight = true;
                            break;
                        }
                    }
                    if (ia == self._myMapMaxX) continue;
                    for(var ib = b;ib>self._myMapMinX;ib--){
                        computerTime ++;
                        if (self.tiledLayer.getTileGIDAt(ib, a) == self._myCityAreaGid){
                            xToLeft = true;
                            break;
                        }
                    }
                    if(ib == self._myMapMinX) continue;
                    for(var ic = a;ic> self._myMapMinY;ic--){
                        computerTime ++;
                        if (self.tiledLayer.getTileGIDAt(b, ic) == self._myCityAreaGid){
                            yToUp = true;
                            break;
                        }
                    }
                    if(ic ==self._myMapMinY) continue;
                    for(var id = a; id<self._myMapMaxY;id++){
                        computerTime ++;
                        if (self.tiledLayer.getTileGIDAt(b, id) == self._myCityAreaGid){
                            yToDown = true;
                            break;
                        }
                    }
                    if(id == self._myMapMaxY) continue;
                    if (xToLeft && xToRight && yToUp && yToDown){
                        self.tiledLayer.setTileGID(self._myCityAreaGid,b,a);
                        self.SmallMap.setTileGID(self._myCityAreaGid,b,a);
                        self._myCityTiledNum ++;
                    }
                }
            }
        }
    },

使用TiledMap做的圈地游戏相关推荐

  1. LYVC揭秘硅谷核心基金圈投资游戏规则

    本文讲的是LYVC揭秘硅谷核心基金圈投资游戏规则[IT168 资讯]从最早期的半导体企业,到Intel.苹果等巨头首次展露锋芒,再到2000年的互联网泡沫破灭,随着经济与科技形势不断起伏,硅谷风险投资 ...

  2. 酷狗直播联手腾讯游戏破圈“组团” 游戏直播正版化杀入重量级玩家

    当前游戏直播行业发展已经进入白热化阶段,市场参与者越来越多.伴随而来的直播乱象也屡见不鲜,尤其是在版权方面,侵权盗播和不正当竞争层出不穷,亟待政府监管和前线平台共同发力解决. 日前,酷狗直播与腾讯游戏 ...

  3. 基于HTML5平台做的“手机网页游戏”

    游戏在这个娱乐年代怎么可能少,微信有了游戏,这个平台也成了它的主要增值空间."愤怒的小鸟"."捕鱼达人"."水果忍者",一个个耳熟能详的手机 ...

  4. 如何用python编一个扫雷游戏_用 Python 做一个 Windows 扫雷游戏

    原标题:用 Python 做一个 Windows 扫雷游戏 本文代码基于 python3.6 和 pygame1.9.4. Windows XP 上的扫雷是无数80/90后的集体回忆,今天我们就用 P ...

  5. 分享好玩的h5小游戏制作步骤_怎么做h5微信小游戏

    近年来,市面上一直流行各种h5游戏,例如投票.答题.刮刮乐.大转盘等等等等,而且我在各种营销场景下经常看到它们的身影,是做促销,引流和宣传的神器之一! 那么,怎么做好玩的h5游戏?还在找h5小游戏模板 ...

  6. 如何用C语言实现圈叉游戏(-)

    今天情人节,还是在学习C语言 自己写了一遍发现自己写的没有书上的代码更简练 就把书上的代码稍微修改了一下 下面看游戏界面 和昨天的米字棋差不多,有时间会结合米字旗的代码做些修改 上代码: /*井字游戏 ...

  7. c语言画叉,如何用C语言实现圈叉游戏(-)

    今天情人节,还是在学习C语言 自己写了一遍发现自己写的没有书上的代码更简练 就把书上的代码稍微修改了一下 下面看游戏界面 和昨天的米字棋差不多,有时间会结合米字旗的代码做些修改 上代码: /* 井字游 ...

  8. MODE —— 两个人在计算机上玩圈叉游戏|井字游戏(知识点:二维数组)

    问题描述: 让两个人在计算机上玩井字游戏(也称圈叉游戏). 井字游戏就是一个3X3的方格,两个人轮流在方格中输入标记X 或者 O .谁先使自己的3个标记链接成水平,垂直或对角线.谁就是赢家. 运行结果 ...

  9. 如何用Unity和Cardboard做一款VR游戏

    随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左 ...

  10. 《看聊天记录都学不会Python到游戏实战?太菜了吧》(8)我们开始做一个数字小游戏吧

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将 ...

最新文章

  1. 集成模型Xgboost!机器学习最热研究方向入门,附学习路线图
  2. 超越卷积、自注意力机制:强大的神经网络新算子involution
  3. 8 个你必须要掌握的 GitHub 实用技巧!
  4. php粒子背景特效_粒子背景特效Particleground.js插件使用解析_蓝戒的博客
  5. 海尔联手软银机器人,进军服务机器人领域
  6. (pytorch-深度学习系列)pytorch实现自定义网络层,并自设定前向传播路径-学习笔记
  7. 安全登录代码 php,PHP登录怎么写安全
  8. 使用dockerfile自动化构建镜像
  9. C++ string 大小写转换
  10. html 的css骚操作,意想不到的 CSS 伪元素 before/after 各种骚操作 - 文章教程
  11. 吴恩达深度学习2.2练习_Improving Deep Neural Networks_Optimization
  12. C语言第12轮:指针
  13. Invalid format of Import utility nameVerify that ORACLE_HOME is properly oracle11.2g 无法imp,dmp
  14. safair中vue修改了数据,但是视图没有更新解决方案
  15. 【转】Android屏幕适配全攻略(最权威的官方适配指导)
  16. Java Json格式化工具
  17. MTK平台如何切换SIM卡槽
  18. jstack排查死锁问题
  19. 流程图的会签、或签、转审、加签、一票否决实现
  20. MAC OS X 问题库

热门文章

  1. 通达OA工作流-表单设计
  2. python for循环经典案例
  3. 单片机p2.0引脚c语言,单片机C语言教程二
  4. DB9接口公头母头引脚区别
  5. delphi 侧边栏_Delphi 开发工具各版本官方下载地址
  6. 单片机c语言 课程设计报告,51单片机课程设计报告.doc
  7. 机械工程专业英语复习
  8. LINGO编程简介与实例
  9. 利用微软输入法 入侵2003服务器,打开Word或Excel也可被攻击 金山卫士推送微软补丁...
  10. 安装LoadRunner11时,会报缺少vc2005_sp1_with_atl_fix_redist错误