最近在弄《万国觉醒》内城DIY的实现,做到道路实现这一块,有点类似于刷地图的道路,然后参考了一些网上的资料,最终实现了,在这里记录一下。

像道路的拼接,是有数据依据在里面的,下面我们先来看下用到的资源。

我们的大地图是45°角的,先来看4张图:1号,2号,4号以及8号。可以发现,他们刚好是四个角落的素材。现在我们把一张图,按照4等份来分,默认以0来标识,如下:

0   |  0
----------------
0   |  0

再把刚才所提到的4张图,根据编号和位置,填到上面的结构里,如:

1号图(右上角):

0   |  1
----------------
0   |  0

2号图(左上角):

2   |  0
----------------
0   |  0

4号图(左下角):

0   |  0
----------------
4   |  0

8号图(右下角):

0   |  0
----------------
0   |  8

首先,像万国觉醒那样,我们需要先拖出一张道路的图片放到地上,就是0号图片

如上图所示,我们放下0号图片,我们把这张图片用大写A表示,这时候按照上面的编号,如果左上有图,那么应该就是2号图,右上有图那么应该就是1号图,如此类推。我们先把4个方向的格子都按照我们上面的打上标记。

然后我们再放下一张道路图,还是0号图片,我们就放在上图的左上角,命名为B,这个时候会发生什么呢,看下图

0号图片放下去后,我们按照第一步的方法,先把四个角都进行标记。因为B图放的这一格,是上一步A图的左上角,而这一格子,我们在上一步中已经填了数值,所以这一步我们按照对应的位置把数字加上去,因为放下来的图片默认都是0,所以就得到和第一步一样的数据。然后因为B图的右下角是A图,所以我们把B图右下角的数据和A图的数据对应相加,因为A图的格子数据也是默认的0,所以相加后变成了新的数据。可以发现,现在A图数据是2,0, 0, 0,然后我们把这四个数字相加,可以得到总数是2,然后把B图的数据相加,可以得到总数是8。那2和8对应了什么呢。可以看到示意图上,这两张图片都不是0号图片了,刚才放下去的0号图片,也就是B图,变成了2号图片,第一次放到0号图片(A图)变成了8号图片,正好是我们实际需要的效果,可能这里你还觉得是巧合,那么我们继续看下去,再放第三张图,命名为C,就放在B图的左下角,看看效果如何

好了,放下图片后,我们按照惯例,把四个角的数据都对应赋值上。因为这一步放的C图,本来是在B图的左下角,所以我们数据对应位置相加,再把这4个数相加得到总数4,可以看到4号图片就是我们要的效果,所以C图就变成了4号图片。然后看看B图,上一步我们B图的数据就是2,0,0,0,这一次放了C图后,因为B图在C的右上角,那么把C图右上角的数据相应加上B图当前的数据,得到上图的数据2,0,1,0,然后4个数相加得到3,可以看到3号图就是我们要的效果。

数学原理:以1,2,4,8分别代表一个区块的4个角落的素材编号。当发生叠加时候,将角落里的值进行累加,最后,4个角的合即为地图区块所对应的编号。

程序实现

其实有了数学原理之后,代码实现起来就比较简单了,首先肯定是有内城格子的数据的,每个格子都有自己的index,index和x,y坐标可以相互转换,例如我们内城格子的72*72,那么     index = y * 72 + x,x = index % 72, y = index / 72;

Dictionary<int, int[]> m_roadDic = new Dictionary<int, int[]>();//这个存放的是每个格子自己分成4等份后的数据,key是index
        Dictionary<int, SpriteRenderer> m_roadPicDic = new Dictionary<int, SpriteRenderer>();//这个是每个格子的图片,key是index
        //这个参数是格子的x,y坐标
        private void HanldeRoad(XVector2 xvec)
        {
            int index;
            Pos2Int(xvec.x, xvec.y, out index);
            if (m_bUsedArea[index] != 0) return;
            SetRoadData(xvec.x - 1, xvec.y, 0, 2);//左上
            SetRoadData(xvec.x, xvec.y - 1, 2, 1);//右上
            SetRoadData(xvec.x, xvec.y + 1, 1, 4);//左下
            SetRoadData(xvec.x + 1, xvec.y , 3, 8);//右下
            SetRoadData(xvec.x, xvec.y, 0, 0, true);//自己
        }
        //处理四个角落格子的数据和自己的数据
        private void SetRoadData(int x, int y, int dataIdx, int addNum, bool isNew = false)
        {
            int index;
            Pos2Int(x, y, out index);//坐标转Index
            if (!m_roadDic.ContainsKey(index)) {//没有这个index数据就生成先
                m_roadDic[index] = new int[4];
            }
            if(!isNew && m_roadDic[index][dataIdx] != addNum) {//如果这个节点的数据已经是要改变的数据,那么就不需处理了,例如本来左下角就是4,那么就没必要再加4了,不然变成8显然是不对的
                m_roadDic[index][dataIdx] += addNum;
            }
            if (m_bUsedArea[index] == ECBuildid.BuildRoad || isNew) {//已经是道路类型的格子才需要去重新设置图片,否则不需要动,只需要缓存数据
                if (isNew) {
                    m_bUsedArea[index] = ECBuildid.BuildRoad;
                }
                if (!m_roadPicDic.ContainsKey(index)) {
                    var go = GameObjectExt.TakeObjInstance("building_road");
                    if (go != null) {
                        Vector3 worldPos = m_tileCastleDetail.Converter.LogicXYToWorldPos(x, y);
                        go.transform.Attach(m_entity.CacheTf);
                        go.transform.position = worldPos;
                        var tsfBuild = go.transform.Find("SrColor/build");
                        tsfBuild.localScale = new Vector3(0.507f, 0.507f, 0.507f);
                        var srBuild = tsfBuild?.GetComponent<SpriteRenderer>();
                        m_roadPicDic[index] = srBuild;
                    }
                }
                int sum = 0;
                for(int i = 0, n = m_roadDic[index].Length; i < n; i++) {
                    sum += m_roadDic[index][i];
                }
                if(sum > 15) {//大于15是没有意义了
                    sum = 15;
                }
                m_roadPicDic[index]?.SetFullUISprite($"World_New/Sprites/CityBuilding/atlas/{sum}");//更换这个格子的图片
            }
        }

参考:AS3地图拼接与战争迷雾的实现 - GameRes游资网 - Powered by Discuz!

SLG游戏DIY内城道路实现相关推荐

  1. 腾讯游戏学院------SLG游戏技术【笔记】

    文章仅记录部分内容作为笔记,对视频感兴趣的可见下面链接的原视频: https://gameinstitute.qq.com/course/detail/10108 课程目录: 这里面提到的游戏,直接用 ...

  2. 《黑道风云》与日本、美国的黑道文化,SLG游戏出海如何突破重围,变身黑马?

    <黑道风云>是一款2016年在海外上线的COK-like SLG游戏,这款游戏初上线时成绩平平,没有引发多大关注,但2018年4月在日本和美国市场突然爆发,一鸣惊人闯入中国手游出海收入榜T ...

  3. 《West Game》入围收入Tpo30的背后,SLG游戏新机会在哪?

    SLG游戏一直是游戏出海的重要品类.由于头部效应明显,加之产品研发周期长,投放回收慢,整个品类的门槛都很高,但其高营收以及长运营周期又吸引着众多大厂的进入. 在近期,SensorTower发布的202 ...

  4. 城市代码表_从零开始做一个SLG游戏(六)游戏系统以及配置表

    本文主要是来梳理下游戏内的基本系统(虽然只是照搬polytopia的,但是还是要总结一下),并预先做一些配置表,并实现读取. 一.经济系统 1.总述 经济系统可以是整个游戏的核心.在本游戏中只有一种资 ...

  5. SLG游戏性能优化个人总结

    最近一直在做SLG游戏的性能优化,趁着手还热乎,把自己一些心得总结一下. 目前SLG是基于Flash制作的,语言当然是AS3.0,目前Flash虽然要死要死的了,可是他背后的AS3.0是非常强大的,目 ...

  6. Unity:SLG游戏画线模块

    最近学Shader有点心得,做了一个SLG画线模块.github地址:https://github.com/871041532/SLGDrawLine 性能有能再提高的地方,欢迎大佬指点. 1.介绍 ...

  7. Java版SLG游戏 竜退治2

    剣と魔法の世界のターン制シミュレーションゲーム.マップは小規模ながら完成度は高いです. ストーリーは希薄で.ひたすら仲間やアイテムを集めつつ.淡々とステージクリアしていきます.   アイテムの経験値が ...

  8. slg游戏客户端框架简析

    前言 从18年3月开始,进入新公司,参与一款slg海战类游戏的开发,全程负责slg海战类游戏大地图模块的开发,以及部分框架的完善和其他内容的开发.游戏已经正式上线一段时间了,工作空闲了一些,趁空闲的这 ...

  9. SLG游戏中大地图实现使用四叉树技术

    SLG游戏中大地图实现使用四叉树技术 四叉树是一种数据结构 每个节点最多有四个子树的数据结构 适用于二维图片的像素定位 SLG游戏地图中有动态的资源也有静态的资源 动态资源如玩家 敌人 静态资源有房屋 ...

最新文章

  1. STM8单片机串口驱动的深度解析
  2. python没基础可以学吗-无基础学python,能学会吗?
  3. java编译时多态和运行时多态_运行时多态、编译时多态和重载、重写的关系(不区分Java和C#,保证能看懂!)...
  4. 机器人动力学与控制_力控制与位置控制的区别
  5. koa2:通过Ajax方式上传文件,使用FormData进行Ajax请求
  6. mtk驱动sensor移植
  7. matlab glxs,Matlab中的textscan(转载整理)
  8. 151只宝可梦(神奇宝贝)倒背的我,却连元素周期表都背不过 -- Python 爬虫小课 3-9
  9. 解决使用 Bluetooth Audio Receiver 蓝牙传音卡顿问题
  10. [数据仓库复习] —— 维度数据模型
  11. “科林明伦杯”哈尔滨理工大学暑假训练赛 B吃雪糕 (异或思维题)(补题)
  12. 用酒精,湿巾,擦笔记本电脑/键盘,然后触摸板就不能用了?什么情况?
  13. [练习]QQ/微信 表情收藏-测试用例的编写 [简洁思路]
  14. 2021-2027全球与中国触控板市场现状及未来发展趋势
  15. Jupyter notebook 报错 500 : Internal Server Error的解决方法
  16. js加密大全(防止客户端查看自己的js文件)
  17. 大数据开发的面试总结
  18. ModuleNotFoundError: No module named ‘model‘
  19. linux删除两个文档中相同记录的行
  20. mybatis和ibatis的区别

热门文章

  1. [踩坑篇]logrotate切割日志后,日志还是写在老日志文件中
  2. 关于Android ViewPager禁止滑动
  3. 【服务器管理】mount.nfs: Stale file handle的解决办法
  4. 软件工程项目总结文档
  5. spring加载properties文件顺序
  6. 广告投放相关专业名词整理
  7. 【OSChina-MoPaaS应用开发大赛】幼家宝
  8. 让机器听声音识别男女(机器学习的方法)
  9. 传统企业建企业网站应当懂得借助外力
  10. 2019 CSP-J 真题 题目、答案以及解析