-【yzc88亚洲城】-游戏出海,ar增强现实,虚拟现实,yzc88亚洲城,yzc88亚洲城教程下载首选亚洲城,yzc88亚洲城官网

标题: 随机地图拼接方法 [打印本页]

作者: 清风    时间: 2019-1-24 20:57
标题: 随机地图拼接方法
游戏设计者总是希望关卡具有可复玩性(replayable)。尤其是对一些刷刷刷的游戏,闭着眼睛不迷路的地图实在是很枯燥。
要让地图有新鲜感,又不引入新的制作成本,随机性是一个重要的手段。

随机性,至少包括两类用法。

一种是初始状态随机和过程选择随机,比如minecraft。Minecraft中的地形,包括湖泊、沙漠、森林,每个地图都由一个随机种子生成。相同的种子可以生成完全相同的地图,而不同的种子生成的地图则差异很大。(https://zhuanlan.zhihu.com/p/26789589, https://www.zhihu.com/question/20754279, https://www.reddit.com/r/gamedev/comments/16yyqw/how_does_minecraft_generate_structures_especially/



第二类是利用已有的素材做二次加工,使用的素材本身带有随机特性。自然界的云彩,水流,火焰,岩石等整体上很美观,却又不属于完全的随机。利用这些素材做二次加工可以做成很多细节丰富,整体上也不违和的效果。比如在已有数学形式上附加一个小扰动(如Perlin noise),是一种增加细节的有效方法。(http://gulu-dev.com/post/2014-11-16-open-world, https://blog.codingnow.com/2014/09/sandbox_world.html



前一种较容易将生成过程形成算法,在游戏运行过程中动态运行。拼接的效果由算法和预设的约束共同决定。后一种一般由地图设计者操作,地图设计者评价最终效果并决定是否合用。


下面总结了一些随机地图拼接的例子,总体上属于第一种使用随机的方法。



暗黑3
类似于拼图游戏(http://www.zhihu.com/question/35430956),暗黑3的地图由一系列预先制作好的图块拼成。





暗黑3地图的最小单位是tile,每个tile的属性包括大小、形状,以及其上的路点、事件类型等。给定一系列的基本tile(https://www.diablowiki.net/Randomization),以及tile之间的连接关系,地图可以在游戏过程中由tile动态拼接完成。拼接过程中,选择哪个tile,如何旋转摆放tile,都是随机的。最终生成的地图大小也是随机的。





随机不是随意。tile之间必须满足相应的拼接关系。拼接后的地图如果有很多的死胡同,过多或过少的成片区域,玩家的体验也会大打折扣。下一个案例中通过区分tile类型和约定tile的连接规则避免生成不符合预期效果的地图。


Daggerfall
Daggerfall的思路和暗黑3类似(https://gamedevelopment.tutsplus.com/tutorials/bake-your-own-3d-dungeons-with-procedural-recipes--gamedev-14360),组成地图的基本单位也是tile。

在Daggerfall中tile分为三类:
房间:有一个或多个出口
走廊:一个很窄很长的区域,有两个出口,可能是一个斜坡
连接处:有三个以上出口的小的空间





房间一般用于boss战斗区域,对应于地图上较大的区域。走廊占用的区域较小,承载简单的剧情和战斗。连接处则用于组装和连通。Daggerfall中,房间只能连接走廊,连接处只能连接走廊,走廊可以连接房间或连接处。而且tile之间不能互相穿插,这一点可以用BBox判定。
生成算法:

1)选择有最多出口数的tile作为初始拼图
2)对每个未连接的出口生成一个符合条件的模块
3)重新建立一个目前未连接的出口的列表,重复第二步

另外,地图要素(比如可打碎的罐子,墙上忽明忽暗的火炬等)是附着在tile上的。在组件的地面或墙面上标记一些mark点,每个mark点上随机生成一些匹配的要素。在暗黑3中,地图要素还包括事件等逻辑要素。


POE
POE的玩法类似暗黑3,但是地图拼接方法则有不同(https://www.youtube.com/watch?v=GcM9Ynfzll0https://gamedev.stackexchange.com/questions/148418/procedurally-generating-dungeons-using-predefined-rooms)。
首先,在一个给定大小的地图上选择两个房间,一个是Start,一个是End。
然后将整个地图切分成一系列的房间(房间的大小也是预设的)。
给每一个房间随机分配一个权重(用颜色表示)
利用每个房间的权重,找到从Start到End的一条最短路径
在这条最短路径上,将相邻的房间打通,这样就形成了从Start到End的唯一一条可通行路径。
最后,再增加一些路径分支。
Rogue

http://www.roguebasin.com/index.php?title=Basic_BSP_Dungeon_generation
Rogue算是随机地图生成的鼻祖了,使用的算法也很简单。

Rogue中生成的地图是固定大小的。给定一个地图大小,不断的切分每个区域,直到每个区域的大小和预设的房间大小差不多大为止。切分时有两个参数需要选择,一个是切分方向,可以是水平切分或竖直切分,另一个是切分位置。这两个参数都是通过随机确定的(当然,为了使最终的结果反映设计者的偏好,可以使用normal分布等方式函数做随机。)


切分完成后,我们得到了一系列的房间。这些房间在逻辑上都挂在一颗BSP树的叶子节点。接下来,按BSP树的层次将各房间连通。每个房间和自己的兄弟房间建立连接关系。每个中间节点和自己的兄弟节点建立连接关系。最终所有的房间都能直连或通过其他房间间接连通。





TinyKeep
TinyKeep提供了一种全新的地图生成方法(http://tinykeep.com/dungen/https://github.com/SSYGEN/blog/issues/7http://blog.tinykeep.com/2013/09/just-sneaky-quick-update-from-us-today.htmlhttps://www.reddit.com/r/gamedev/comments/1dlwc4/procedural_dungeon_generation_algorithm_explained/),步骤如下:
1)首先设置地图cell大小,比如设置成150. 虽然可用设置成任意值,但是值越大,地图就越复杂
2)对每个cell,生成一个矩形。矩形的长和宽是在一个长度范围内随机的。虽然随机范围并不是关键,但是通常情况下应该设置成和cell数目成正比例关系。

需要注意的是,我这里使用的不是uniformly distributed random number算法,而是使用了Park-Miller Normal Distribution。该算法生成的随机数偏好小的整数,最终结果是边长小的矩形占了大多数。


除此之外,还保证矩形的长和宽比例在一定范围内。我们既不希望看到方形的房间,但是也不希望看到非常瘦的房间。
3)到此为止,我们在一个小的区域中生成了150个随机边长的矩形,大部分都是和其他矩形重叠的。下面我们将用一个算法调整矩形位置,让所有的矩形都不和其他矩形重叠,但与此同时,保持矩形之间尽量紧挨着。

4)然后,把所有的空白处添上1x1的cell。结果是一个由不同大小的矩形填成的网格,每个矩形都不和其他矩形重叠,而矩形之间也没有空白
5)接下来,我们判定哪些cell应该属于房间。方法很简单,每个cell,如果其长和宽超过一个阈值都被认为属于一个房间。由于我们生成随机数时大部分都是很小的矩形,所以我们生成的矩形只有很小一部分属于房间。

6)接下来,我们要把各房间连接起来。先用Delaunay Triangulation算法将每个房间的中心点构造出一个graph。现在所有的房间都连起来了,而且连线不会互相交叉

7)然后用最小生成树算法删去其他的边。这保证了所有的房间都连起来,所以是可达的

8)最小生成树算法看起来不错,但是生成的地图没有环,还是有点单调。这是另一个极端。所以我们额外在最小生成树上加一些边(比如在Delaunay Triangulation中选15%的边)。最终结果是一个由所有房间组成的图,每个房间都可达,且有一些环,不至于太单调。

9)然后,我们把每一个边转换成一个L形的折线,每个cell只要和这个折线有交点都会被保留为一个corridor tile。由于cell的大小不固定,生成的corridor的边缘是扭曲而不均匀的,这正是一个dungeon所需要的。






知乎@realTOM








作者: wasdml123    时间: 2019-1-24 21:17
随机地图拼接方法
作者: 15234084053    时间: 2019-1-25 08:16
6666666666666666666666666666666666
作者: 猫非147    时间: 2019-1-25 08:23
随机地图拼接方法 [修改]
作者: 禽兽    时间: 2019-1-25 08:39
牛逼牛逼!在线佩服
作者: 302686698    时间: 2019-1-25 09:03
aaaaaaaaaaaaaaaaaaaaa
作者: feiyoung    时间: 2019-1-25 09:11
谢谢分享
作者: sunkai    时间: 2019-1-25 09:30
随机地图拼接方法
作者: zg12356780    时间: 2019-1-25 09:34
厉害,大佬NB
作者: DestroyerL    时间: 2019-1-25 09:41
可以的,66666
作者: zjwmyl    时间: 2019-1-25 09:41
不错,很好,哈哈
作者: 李明宇01    时间: 2019-1-25 09:42
求源码楼主发出来吧或者制作成插件
作者: llupll    时间: 2019-1-25 11:38
干货很实用,感谢分享!
作者: 朱老师    时间: 2019-1-25 11:51
厉害,大佬NB
作者: 星辰xzx    时间: 2019-1-25 13:35
谢谢分享!
作者: tiancaiwlk    时间: 2019-1-25 14:07
Delaunay Triangulation 出来的都是三角形的边, 最小生成树能保证不相邻的两个房间的连线被删除吗?
作者: 漫道_蛮牛    时间: 2019-1-25 14:37
不错,很好,哈哈
作者: Evil_He    时间: 2019-1-25 17:36
6666666666666666666666666666
作者: U你体3滴    时间: 2019-1-26 09:09
妈妈问我为什么跪在屏幕前
作者: ApolloAR    时间: 2019-1-26 11:58
厉害了
作者: ttma01    时间: 2019-1-26 23:45
谢谢分享
作者: 826669723    时间: 2019-1-27 12:56
也是6666
作者: 禽兽    时间: 2019-1-28 09:20
牛逼牛逼牛逼!不过作为美术人员完全看不懂的
作者: boy840102    时间: 2019-1-28 10:55
谢谢楼主大大。
作者: worlfsnake    时间: 2019-1-28 14:13
6666666666666666666666666666666666
作者: szwx3921    时间: 2019-1-28 15:53
厉害厉害,学到了
作者: yukino4649    时间: 2019-1-29 17:34
学到了。然而啃不动 嘤嘤嘤
作者: 15234084053    时间: 2019-1-30 08:19
66666666666666666666666666666666666666
作者: SunNightz    时间: 2019-1-30 14:37
这也太给力了吧
作者: yoho_code    时间: 2019-1-30 14:59

作者: longfeixiaozi    时间: 2019-1-31 10:32
谢谢分享
作者: SrMao_e432t    时间: 2019-2-1 09:54
牛b 学习了 之前想找相关资料很久了
作者: Beike    时间: 2019-2-3 22:06
看不懂看不懂,唉
作者: guojunshi    时间: 2019-2-11 14:38
我挺喜欢这个教程的软件的不错
作者: guojunshi    时间: 2019-2-11 14:39
我挺喜欢这个教材的可以随机生成地图的方式不错的玩法 我挺喜欢这个教材的可以随机生成地图的方式不错的玩法
作者: guojunshi    时间: 2019-2-11 14:44
我挺喜欢这个教材的可以随机生成地图的方式不错的玩法 我挺喜欢这个教材的可以随机生成地图的方式不错的玩法我挺喜欢这个教材的可以随机生成地图的方式不错的玩法
作者: 月马    时间: 2019-2-11 16:35
土狼大佬牛b
作者: 步行骑士    时间: 2019-2-12 08:51
{:91:}
作者: wo845458804    时间: 2019-2-12 16:25
Mark Mark Mark Mark !!!!1
作者: guojunshi    时间: 2019-2-13 13:54
地图拼接的方法是不错的游戏场景制作的关卡设计必须的学习的 地图拼接的方法是不错的游戏场景制作的关卡设计必须的学习的地图拼接的方法是不错的游戏场景制作的关卡设计必须的学习的地图拼接的方法是不错的游戏场景制作的关卡设计必须的学习的地图拼接的方法是不错的游戏场景制作的关卡设计必须的学习的
作者: 步行骑士    时间: 2019-2-14 09:19
{:107:}
作者: sd3314480    时间: 2019-2-14 10:32
Mark一下,好东西。谢谢分享
作者: lifelife    时间: 2019-2-14 10:45
牛逼牛逼!在线佩服
作者: 莫小兮    时间: 2019-2-14 12:30
随机地图拼接方法
作者: 根鸟的翅膀    时间: 2019-2-14 14:42

作者: ykr168age    时间: 2019-2-19 09:15
有没有 unity 的相关插件?
作者: ZhenWL    时间: 2019-2-19 09:49
MarkMarkMark
作者: lezard618    时间: 2019-2-21 10:07
这个不错,学习了
作者: cainiaofan    时间: 2019-2-21 13:10
谢(赞)。谢(美)。(大)女。(老)装。土。狼
作者: 云岫丷    时间: 2019-2-21 15:53
对于rogulike游戏的开发有很大帮助
作者: wx_OXPx1ndC    时间: 2019-3-1 09:38
真是太好了
作者: 雾霾    时间: 2019-3-1 11:56
6666666666666666666
作者: huangjiyao    时间: 2019-3-3 12:46
大佬厉害,感谢分享
作者: R·Yang    时间: 2019-3-5 15:06
随机地图拼接方法
作者: unity的初学boy    时间: 2019-3-12 16:51
在线佩服 牛皮
作者: rxxy1211    时间: 2019-3-17 11:07
xiexie  dashen  00
作者: tianyizll    时间: 2019-4-2 18:13
6666666666666666666666666666666666666666666666666666
作者: yhr28    时间: 6 天前
谢谢分享啊!!!
作者: a273270313    时间: 3 天前
66666666666666666666
作者: a273270313    时间: 3 天前
666666666666666




欢迎光临 -【yzc88亚洲城】-游戏出海,ar增强现实,虚拟现实,yzc88亚洲城,yzc88亚洲城教程下载首选亚洲城,yzc88亚洲城官网 (/) Powered by Discuz! X3.2