Gamerpgmaker地图S2怎么随机生成地图.

Gamelook报道/对于大多数的游戏来说内嫆的消耗都是开发商非常棘手的问题,而随机生成地图的做法则大大增加了游戏的可重复性并且可以丰富玩家的体验。最近海外一名資深开发者在博客中分享了他做随机生成地图的方式,以下请看Gamelook编译的博客内容:

这篇博客主要解释的是一个做随机生成地图的技术之湔TinyKeepDev也进行过简略的描述,但我这里会用更多的细节和步骤来解释这个做法总体来说,整个算法的运行方式可以用下面的gif图表示:

首先伱要生成一些宽和高不同的房间,随机地放在一个圈内TKdev的算法用了比较常见的方法随机生成房间尺寸,我认为这是一个不错的想法因為它可以为你带来更多的参数可供使用,使用不同的宽高比例和标准偏差可以带来外观不同的副本地牢

你可以在里获得更多的信息(英攵版),在此之后你就应该可以做出像下图这样的东西了:

你需要考虑的一个非常重要的事情是,由于你(至少是概念上)在处理一个tile網格所以你必须把所有的东西都对齐到同一个网格里,在上图的gif中tile的尺寸是4像素意味着所有的房间位置和尺寸都必须是4的公倍数。为叻做到这样我把位置和宽高比例都放到了一个函数中,把这些数字和tile尺寸相匹配:

现在我们可以说说分离的部分了。有很多的房间都混在了同一个地方而且它们之间不能有重叠。TKdev使用了分离转向的做法但我发现用一个物理引擎做起来更简单。在你增加了所有的房间の后只要增加物理物体(solid physics body)匹配每个房间的位置、然后运行模拟,直到所有的物体都出于休眠状态在gif里我是用平常的速度运行模拟,泹当你们做不同关卡之间的模拟时可以用更快的速度。

这些物理物体本身并没有和tile网格相联系但当设定了房间位置并且和随即指令放箌一起的时候,你就会得到这些并不重叠的房间而且这些房间与tile网格是匹配的,下面的gif对此进行了展示蓝色外形是物理物体,在它们囷房间之间总有一些不匹配因为他们的位置始终是分散的。

当你希望创造水平或者垂直分布的房间时这样的做法可能会出现一个问题,比如我现在在做的游戏:

游戏里的战斗都是水平向的所以我的游戏当中大多数的房间都更更宽,但可能没有那么高问题在于,物理引擎如何解决这些比较长的房间在一起的时候出现的冲突:

你们可以看到的是地牢变得非常高,这并不是理想中的状况为了解决这个問题,我们可以一开始就把这些房间按带状分布而不是环形这可以确保地牢本身有合适的宽高比例:

为了在这个带状区域里随机分布,峩们只要把getRandomPointInCircle函数进行改变把分布点放到椭圆形中即可,在gif里我使用的椭圆形宽度为400高度为20):

下一步主要是解决哪些房间是主房间或鍺中心房间,哪些是附属房间TKdev的方法是非常不错的,你只需要挑选超过一定宽高比阀值的房间即可在下面的gif里,我用的阀值是1.25也就昰说,如果平均宽和高是24那么超过宽和高30的房间都会被选择。

现在我们把所有选中房间的中间点找出来然后放到剖分程序中,你可以洎己做这个过程也可以找有经验的人分享这方面的资源。我在做游戏的时候比较幸运的是Yonaba已经做了这个过程你们可以在界面中看到:

茬有了这些三角形之后,你随后就可以生成一个图形这个过程可以非常简单地给你带来图形信息数据结构或者数据库。如果你没有做过那么房间物体或者结构最好有独特的ID,这样你就可以把这些Id加到图形中而不是来回复制。

在此之后我们从图形中生成了一个最小化嘚生成树,需要再强调一次的是你可以自己做也可以找有经验的人去做(前提是和你使用的同一种编程语言)。

最小化生成树可以确保哋牢中所有的主房间都是可达的但同样将让这些房间的连接方式和此前不一样。这是很有用的因为我们通常都不希望做一个连接太紧密的地牢,但也不希望做成不可达的孤岛然而,我们又不希望地牢只是一个平行的路径所以我们现在要做的就是为剖分图形增加一些邊界:

这可以增加更多的路径和循环,这会让副本地牢变得更加有趣TKdev当时是增加了15%的边界,而我发现8-10%是更好的选择当然,这主要取决於你希望这些副本地牢之间的连接密度是怎样的

最后,我们希望为地牢增加走廊为此,我们检查了图形中的所有节点然后在相邻的節点之间我们可以创造直线,如果这些相邻节点排列比较平行的话我们就可以做一个水平线。如果这些节点比较垂直我们可以做垂直線,如果这些节点没有相邻也没有平行或者垂直我们可以做2跳线形成L形状。

我测试是否相邻的标准是计算两个节点之间的中间点,然後检查中间点X或者Y的属性是否在节点的边界之内如果在,我就可以从这个中间点创造这条线但只能在一个轴上。

在上图中你们可以看到所有情况下的例子,节点62和47之间有一个平行线60和125之间有一个垂直线,而118和119之间有一个L形线另一个比较重要的是,这些都不是我创慥的线这些只是我正在画的,但我还在每个线的旁边创造了2个额外的线确保每一个都能够与tile尺寸匹配,因为我希望游戏中的战士宽度囷高度都至少达到3个tiles

不管怎么说,在这个过程之后我们可以检查哪些并非主房间的房子与这些线冲突,有冲突的房间可以被加到任何伱在用的结构中而且它们还可以作为走廊的轮廓:

根据你最初设定房间的尺寸和均匀度,你到这里就可以获得外观不同的副本地牢了洳果你希望让走廊变得更统一而且看起来不那么奇怪,那么你就应该把偏差做小一些而且应该做一些检查,确保房间不至于太窄或者太寬

作为最后一步,我们只需要增加1个tile尺寸的网格房间不缺漏掉的部分即可需要说的是,你其实并不需要有网格数据结构或者太花哨的東西你可以根据tile尺寸检查每条线,并且在某些列表中增加网格分布位置即可这就是我们增加3条线(或者更多)的原因。

接下来我们嘚随机生成地图就完成了。

整个流程中我返回的数据结构是:一个房间列表(每个房间都只是带有独特ID的结构、x/y位置和宽高比);图形烸个节点对应一个房间id;真实的2D网格,这里的每个房间都是空的可以指向主房间、走廊或者走廊间。有了这三个结构我认为你可以做絀任何类型的数据,然后找到在哪儿放门、敌人、物品决定哪些房间里有BOSS等等。

关于即时战斗游戏地图的随机自動生成算法 [问题点数:0分]

确认一键查看最优答案?

本功能为VIP专享开通VIP获取答案速率将提升10倍哦!

愚以为,可以先随机生成不同的地域,如夶片的水域和沙漠等,再把它们随机组合起来,不知行否

愚见,可以先随机生成相连的水域或沙漠等等,然后再把它们随机组合起来,不知行否

应該是有一定的组合规则的比如在水域或沙漠相连的时候就必须有树木

有个权衡的规则吧,在这个规则的前提下在随机生成吧不知对不對。可以

观察红警2里地图的生成啊是不是有个规则的呢?

你的地图应该是一块一块的吧,用一个二维数组描述一下,相当于填充二维数组,假設要生成沙漠,那么0代表底背景,1代表沙漠块,从数组左上角开始随机填值,但可以如 xglcm(给我一杯矿泉水...) 所言加上个什么规则,比方说填值时判断相临嘚值,根据相临值确定填0还是填1的概率,呵呵,瞎说而已

帝国时代就更牛了一共有十几种地图类型。而且每一种地图永远也没有重复的各类哋图间都有自己明显的特点。

一些重要规则的确应该有但在这些规则的约束下仍有很大的随机空间。

呵呵,说不定他们本来就已生成了成芉上万的地图,你玩的时候它随机提取一个,再使用过后给它加个什么标记,使下次选中它的概率远远降低.:)

匿名用户不能发表回复!

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

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

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

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

?3.用规则来刷新地图

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

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

?建议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的广告吧。

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

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

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

为了让图连通我们需要将xy点打通一条路径

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

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

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

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

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

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

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

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

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

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

?每次相同模块怪物刷新点是固萣的

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

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

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

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

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

?均会有很明显的拼接痕迹

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

?将资源分别打入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上吧

我要回帖

更多关于 rpgmaker地图 的文章

 

随机推荐