2D随机地图的生成

11 篇文章 1 订阅
9 篇文章 0 订阅

ps:记得当初大三上学期时候,曾经被问过一次,steam上一款地图如何生成,当时对这些东西不太了解,卒。这次一起补回来。。

以下很多实现均为猜测!!只是个人实现的方式

以几款游戏为例

1. steam一款策略类游戏

2.元气骑士

3.火炬之光2与暗黑破坏神2

 

1.Kingdoms and castles 

大体是一个随机的格子形地图,可以上面策略经营,并且有塔防元素。

细胞自动机生成地图

1.确定一个种子

2.用一定比例的墙来填充整个地图

3.用规则来刷新地图

4.确保连通性(并重复若干次3操作)

5.用规则来模拟地图上资源的刷新位置

 

规则的选择

1确定墙的比例:

建议40~45%的用随机数来填充原地图

2.刷新地图的规则:

若想让地图块出现的比较规律,且块数较大,规则可以定义如下:

•   枚举每个地图点的位置,

•  若原来是墙:周围的8个方向其中墙的个数少于4,则变为路

•  若原来是路,周围墙的个数大于4,则变为墙。

若想让地图块出现的较为分散,规则可定义如下:

在上面的基础上,再加一层规律:

若原来是路,周围8格内墙的个数大于5,或者,周围16格子内墙的数量小于2,则变为墙

确保是个连通图

1.将所有地图块设置为未标记

2.从每个路点开始作为深搜的起点,每次有未标记过的点则孤立的子图+1

(保存x,y坐标为以后使用)

标记当前点已走

若上下左右四个方向其中有路,则将这个新的点作为深搜起点,函数压栈

3.若子图个数大于2,则表示图不连通。

将刚刚的x,y坐标取出,跑一次prim最小生成树(在跑的时候,需要记录下是从哪一个点松弛的,方便接下来连通)

4.将拿跑prim之后得到的数组,在图上进行打通。这样将会得到一个连通图

  ps:既然我ppt上写了,就直接打个prim的广告吧。

Prim算法

1.取一个点作为起点A,,初始化所有点dis(A,i)的距离 = abs(Xa-Xi ) + abs(Ya-Yi)

dis[i]加入集合U

2.进行子图个数-1次循环,得到需要连通的点的方式

循环的内部步骤:

从已有集合U中,取出最小的,且未走过的点index

用这个index点来松弛所有的点.若可以松弛标记 father[可松弛的点] = index,并加入返回的数组中

3.这样结束之后会得到一组ans二位数组 . Vector( x,  y ) 表示 为了让图连通,我们需要将xy点打通一条路径

用自定义的规则来生成地图上的资源 

比如刚才地图上的树,矿,水域等

游戏里的水域可以用墙来表示,树的规则,我定义的是找到一块面积最大的墙拆掉作为树。

当然这个也可以规定一块(或多块)指定面积和的大小不小于X的墙,来作为资源区域

2.元气骑士(一款不氪不肝的良心游戏。这不算广告吧!!!

九宫格内生成随机连通的地图

随机生成七块地图,则这七块地图再九宫格内必定有连通的方式

连通方式很多:可以用广搜连边 ,或者刚刚的最小生成树连边

出生点与过关点的路径,必定是一个在地图上最长的路径,是一棵树的直径

 

地图上怪物的随机生成

先选择环境,然后因不同的环境会有不同怪物。

每次相同模块,怪物刷新点是固定的

因为怪物刷新会提示,很明显,也有可能是固定了多个mark,从中随机选择若干个)

 

3.暗黑破坏神2与火炬之光2

均是自己猜想,并不是官方的做法

先看一部分非地牢类的图: 比如

暗黑2第一章的血鸦营地,大教堂,过地图的小路 , 以及火炬之光2的地图

均会有很明显的拼接痕迹

一丶用资源来拼接大地图:

主要来源:https://blog.csdn.net/w6316485/article/details/76670286

思路:

将资源分别打入tag,进行分类,比如roomroad

由一点出发,经过若干规则进行拼接,来生成地图。

规则:

房间只能链接走廊

走廊连接房间或者连接处

连接处只能连走廊

其实上图的红色箭头就可以发现,上面引用的博客,并没有处理2d重叠问题(当然也可能我理解错了!)

拼接的方式:

1.Y轴作为基准,给每个方向定义一个Y值。

2.在旋转后,进行向量偏移。

(这个方式无论是2D还是3D地图,都可以。)

实现方式:

初始化一个最初的节点。将这个节点的接入口压栈

随机从prefab中取出一个符合规则的模型进行之前的操作

将这个prefab模型的接入口压栈

进行若干此迭代

 

存在的问题: 

有重叠!!!因为随机无法控制 

若模型均为矩形引入矩阵交判断,若交则同时将栈内的这个接入口剔除,并且销毁这个prefab

若有多边形,拆成线段,判线段交。若相交同上。

线段交问题:百度一下吧很多资料! 我用的是快速排斥+跨立实验

地图上随机资源的生成

对于每个子模型,在上面加上mark,在地图生成后,从这些mark上随机生成一些物品

比如 棺材,罐子,可翻动的暗穴,或者是XXX神殿

 

暗黑3的生成方式:(来自百度)

将地图中划分出若干方格:

大方格(达数个屏幕):体现史诗事件

中方格(整个屏幕):集群出现,来组成一个特定环境的地图

小方格:体现区域边缘

固定方格:刷新一些特殊事件

宝箱方格:随着地图固定

Ps:据说暴雪有蓝贴大体解释了地图生成的方式。

时间大概是20114月之前。。。官网做的搜索功能感人,我找不到了。。

二丶随机生成的地牢地图(之前的是地上的地图部分)

可以想到并实现的方式:

 

1.由刚刚的模型随机拼接,只要基础单元足够小,规律性就不会很明显

2.由基础的迷宫算法生成迷宫后,进行二次拼接

生成多个基础迷宫后,再将多个迷宫连接起来

 

个人觉得第一种,实现的就不错,效果感觉还好,因为定义了规则之后完全可以达到程序想要的效果

 

不过第二种也可以实现,就做了一下

递归迷宫实现

思路:

1.每次随机取到一个中间点,用十字形将地图分为四块。 (参数left,right,top,bottom)来传入这次需要切割的区域

2.定义一个最小的面积,若这次需要切割的区域面积 小于 规定值,跳出

3.在这个点,上下左右中的三个方向的(距离不一定是1)的任意位置开一个洞保证连通

4.因为分了4个块,递归进入,重复1 2 3过程

 

demo在分享之后,想起来贴到git上吧

  • 14
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
帝国CMS(Content Management System)是一款功能强大的内容管理系统,它提供了丰富的插件来满足网站建设的各种需求。地图生成插件是其中一个非常实用的插件。 帝国CMS地图生成插件可以帮助网站管理员轻松生成网站的地图,以便用户快速找到所需内容。该插件通过扫描网站的各个页面和链接,自动生成一个完整的网站地图生成地图根据网站的层级结构进行组织,清晰地展示了网站的各个页面和链接之间的关系。 这个地图生成插件有很多实用的功能。首先,它可以自动更新地图,当网站有新的页面添加或删除时,插件会自动更新地图,确保地图的准确性和实时性。其次,它可以根据网站管理员的设置,过滤某些特定的页面或链接,以确保地图只显示需要展示的内容。另外,该插件还可以为地图添加自定义样式和标记,使其更符合网站的整体设计风格。 利用帝国CMS地图生成插件,网站管理员可以更好地管理网站的内容结构,提升用户体验。用户通过地图可以直观地了解整个网站的构架,并快速找到所需的内容。同时,生成地图也可以为搜索引擎提供更好的导航信息,有助于网站的SEO优化。 总之,帝国CMS地图生成插件是一个非常实用的插件,它可以帮助网站管理员轻松生成网站地图,并提升用户体验和搜索引擎优化效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值