关于制作生成随机地形的二维棋盘(思路分享)
the_nvl_maker吧
全部回复
仅看楼主
level 9
这次算是不务正业的尝试。之前学会了进行怎样的创建函数and同时显示多个养成界面,加上之前琢磨的数组的使用,接着我就有了一个想法,那就是随机生成地形图这样的玩意,然后就有了接下来的尝试……
先贴个成品图——
——
2021年05月29日 19点05分 1
level 9
首先是算法的问题,这边我本人不是什么大神,也就考虑了些很基础的问题,关于这个地形图是否是无限大的,若是有限的,该有多大为合适?
我选择了无限的生成,也就是通过起始点来向四周扩展生成。如果是有限的话未免有些不痛快。
那么接下来的问题是一次性要生成多少?
为了先是简单的测试,我选择弄成9x9的奇数边长的方形
2021年05月29日 20点05分 2
level 9
因为是生成地图后,并且是无限的,假设起点视角中心的坐标为0,0,并随机生成了周围的80个方块地形,那么就得储存起来。因为生成后,你移开视角中心到其他地方,重叠的部分是不会再次生成的。也就是该坐标方块如果生成了地形那么就不再生成。
那么就涉及到了最根本的存储的方式,如果不确定下来,就没法解决后面读取地形图和显示的问题。
2021年05月29日 20点05分 3
level 9
最开始,我依旧是采用数组的方式来存储数据,并利用索引部分充当地图坐标。但致命的问题是索引值不能是负数,那么这样一来就不能用来作为坐标。
问题就成了,如何通过坐标来调取数据,如果不能做到这点,那么就不能完成判断该坐标方块是否已经生成地形。
之后又有了通过数理里面的象限来划分,比如xy都是正值的,就是照常通过索引值来调取存储在第一象限数据,而xy都为负值,就将xy值进行取绝对值来调取第三象限的数据。以此类推。
这样一来虽然合理化了起来,但过程就有些繁琐,也就是每次判断坐标都要先进行判断在哪个象限之后再调取。
光是这样想和编写代码就有些头疼(毕竟我不是大神)
2021年05月29日 20点05分 4
level 9
就在我犹豫的时候,我突然想到了一个笨方法,也就是不利用索引值当做坐标,将坐标放入在每个对象方块数据里面。并赋予每个方块一个id,当做索引值,这样也能调取数组里面的数据了。创建一个函数,输入x,y,遍历数组每个数据,一一对比xy是否相符,相符就返回id值,这样就得到了所需要的方块的数据对应在数组的索引值了。
这样的方法有个弊端,这会导致这个数组的数据很大,特别是生成了大量的地形后,遍历数组就会很慢,但想了想自己构想的游戏里,所需要的不是很大(至少不是几十万的级别)。。读者可以根据需要参考一下,后者的方法写起来是比前者简单一下,逻辑上也简单一点(也没差不多啦)
2021年05月29日 20点05分 5
level 9
解决了读取存储数据的问题后,就得考虑生成的问题了,由于是一开始就只有起始点地形,并且为了让地形连贯,就有了该方块的地形受到四周地形的影响的规则,所以生成地形就通过视角中心这个坐标螺旋式的向外生成。
每次生成前后调用判断该地形是否已经生成的地形的判断函数,如果不是则接着是调用调取要生成地形的方块坐标周围上下左右四点的方块地形,进行不同占比概率的生成地形并存储的生成函数,最后就是调取装载要显示出来的数据的显示函数了,其中都穿插查找id的查找函数。
这样一来就解决了运算的问题了。(道理是这么一个道理,具体怎么写得看个人的想法,以上是我个人的习惯)
2021年05月29日 20点05分 6
level 9
紧接着需要做的就是对接养成面板的方式了,个人设定的工程页面的大小是1280x720,既然是9x9的显示,那么就每个方块就70x70的大小,利用养成面板的通过数值显示不同图形的设定,我将设定的4个地形分别对应了1,2,3,4,这样游戏中读取数值的不同,显示的图片也就不同了。
一开始考虑到9x9,就81个了,然后我就利用edus指令,并行了10个养成面板(包括底层),每个模块都对应一点。效果差不多就是这样
……
2021年05月29日 20点05分 7
level 9
这样9x9就实验成功了,虽然就这样能用了,但我比较贪心,9x9未免小了些,所以我想着要不就15x15吧,本来想着16x16,但中心点难搞,就15x15,如果更大的话,每个方块的图片就会模糊,有些难看……所以就15x15了,每个方块45x45大小,一次显示225个方块。
但想到之前9x9的一对一的显示方式,就得使用上至少23多个养成页面,实在是太疯狂了,并且考虑到之后地形上还得显示建筑天气啥的,这一显示方式太不可行(当然愿意的话也不是不行)
接着我就想到了数值显示图片是根据单一数值来显示对应的图片的,也就12这个值,它会显示出1和2的对应图片,而不是12对应的图片。
这样一来,我就只需通过加减乘除一下得出15位数的数值出来,接着只需1个图片区块,就能显示出这一排的15个方块的地形,接着使用15个图片区块就能显示15x15=225个方块的地形图片了(一开始有些担心int类型会不会顶不住15位数,但实验了下,似乎会自动将数据类型转换成real类型,没啥问题了)
2021年05月29日 21点05分 8
level 9
当然的利用这方式,就能节省大量的图片区块,也自然不止15x15,更多也是可以的,当然超出数值位数上限就有点难办了……
15x15的效果
……
2021年05月29日 21点05分 9
level 9
以上就是本次的思路分享,利用这一思路,不止可以完成地形图的生成,也可以当做一个养成随机图片的玩意……
这次没有添加通过按钮来移动中心视角,达成动态的变换,嘛,根据上面的思路这问题的实现不是很困难的问题,或许下次会演示一下……
望本次思路分享能对后来者起到帮助作用。[呵呵]
2021年05月29日 21点05分 10
1