SLG游戏DIY内城道路实现
最近在弄《万国觉醒》内城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内城道路实现相关推荐
- 腾讯游戏学院------SLG游戏技术【笔记】
文章仅记录部分内容作为笔记,对视频感兴趣的可见下面链接的原视频: https://gameinstitute.qq.com/course/detail/10108 课程目录: 这里面提到的游戏,直接用 ...
- 《黑道风云》与日本、美国的黑道文化,SLG游戏出海如何突破重围,变身黑马?
<黑道风云>是一款2016年在海外上线的COK-like SLG游戏,这款游戏初上线时成绩平平,没有引发多大关注,但2018年4月在日本和美国市场突然爆发,一鸣惊人闯入中国手游出海收入榜T ...
- 《West Game》入围收入Tpo30的背后,SLG游戏新机会在哪?
SLG游戏一直是游戏出海的重要品类.由于头部效应明显,加之产品研发周期长,投放回收慢,整个品类的门槛都很高,但其高营收以及长运营周期又吸引着众多大厂的进入. 在近期,SensorTower发布的202 ...
- 城市代码表_从零开始做一个SLG游戏(六)游戏系统以及配置表
本文主要是来梳理下游戏内的基本系统(虽然只是照搬polytopia的,但是还是要总结一下),并预先做一些配置表,并实现读取. 一.经济系统 1.总述 经济系统可以是整个游戏的核心.在本游戏中只有一种资 ...
- SLG游戏性能优化个人总结
最近一直在做SLG游戏的性能优化,趁着手还热乎,把自己一些心得总结一下. 目前SLG是基于Flash制作的,语言当然是AS3.0,目前Flash虽然要死要死的了,可是他背后的AS3.0是非常强大的,目 ...
- Unity:SLG游戏画线模块
最近学Shader有点心得,做了一个SLG画线模块.github地址:https://github.com/871041532/SLGDrawLine 性能有能再提高的地方,欢迎大佬指点. 1.介绍 ...
- Java版SLG游戏 竜退治2
剣と魔法の世界のターン制シミュレーションゲーム.マップは小規模ながら完成度は高いです. ストーリーは希薄で.ひたすら仲間やアイテムを集めつつ.淡々とステージクリアしていきます. アイテムの経験値が ...
- slg游戏客户端框架简析
前言 从18年3月开始,进入新公司,参与一款slg海战类游戏的开发,全程负责slg海战类游戏大地图模块的开发,以及部分框架的完善和其他内容的开发.游戏已经正式上线一段时间了,工作空闲了一些,趁空闲的这 ...
- SLG游戏中大地图实现使用四叉树技术
SLG游戏中大地图实现使用四叉树技术 四叉树是一种数据结构 每个节点最多有四个子树的数据结构 适用于二维图片的像素定位 SLG游戏地图中有动态的资源也有静态的资源 动态资源如玩家 敌人 静态资源有房屋 ...
最新文章
- STM8单片机串口驱动的深度解析
- python没基础可以学吗-无基础学python,能学会吗?
- java编译时多态和运行时多态_运行时多态、编译时多态和重载、重写的关系(不区分Java和C#,保证能看懂!)...
- 机器人动力学与控制_力控制与位置控制的区别
- koa2:通过Ajax方式上传文件,使用FormData进行Ajax请求
- mtk驱动sensor移植
- matlab glxs,Matlab中的textscan(转载整理)
- 151只宝可梦(神奇宝贝)倒背的我,却连元素周期表都背不过 -- Python 爬虫小课 3-9
- 解决使用 Bluetooth Audio Receiver 蓝牙传音卡顿问题
- [数据仓库复习] —— 维度数据模型
- “科林明伦杯”哈尔滨理工大学暑假训练赛 B吃雪糕 (异或思维题)(补题)
- 用酒精,湿巾,擦笔记本电脑/键盘,然后触摸板就不能用了?什么情况?
- [练习]QQ/微信 表情收藏-测试用例的编写 [简洁思路]
- 2021-2027全球与中国触控板市场现状及未来发展趋势
- Jupyter notebook 报错 500 : Internal Server Error的解决方法
- js加密大全(防止客户端查看自己的js文件)
- 大数据开发的面试总结
- ModuleNotFoundError: No module named ‘model‘
- linux删除两个文档中相同记录的行
- mybatis和ibatis的区别