一种3D游戏随机地图的生成方法与流程

文档序号:11369138阅读:3382来源:国知局
一种3D游戏随机地图的生成方法与流程

本发明涉及一种3d游戏随机地图的生成方法。



背景技术:

在开发一款游戏时,往往存在很多类似的地图场景,这些地图场景由相似的模块构成,只是各个模块的组合方式有差别,如果对于每一个地图场景都手动的将各个模块拼接会消耗大量的时间,延长游戏的开发周期。自动生成随机地图能够在极短的时间内生成地图,美术人员所需要做的工作只要根据策划的要求选择一些比较符合要求的地图场景即可,这极大的加快了游戏的制作速度。另外有些游戏需要时时生成随机地图,这样游戏玩家在玩游戏时每次的地图场景都不一样,这样能极大的增强游戏的可玩性,吸引更多的游戏玩家。现有的随机地图生成方法是从一个模块出发,从它的接口向外随机的选择与其接口匹配的模块组成新模块,再从新模块的接口向外扩充,直到关键模块数满足设计要求,但这种做法可能使地图在某一方向上分布很多,而很多情况下我们希望地图在一个合理的范围内,另外这种做法在关键模块数较多的情况下比较耗费时间。



技术实现要素:

为了解决上述问题,本发明提出了一种3d游戏随机地图的生成方法,该方法能够有效地随机产生地图,使地图在限定的合理范围内,并且能通过设定参数来控制地图的疏密程度。

本发明的目的是通过以下技术方案来实现的:一种3d游戏随机地图的生成方法,所述随机地图由关键模块以及连接关键模块的道路模块组成,该方法包括以下步骤:

步骤1:根据设定的关键模块数量的大小,生成一个二维数组保存地图信息,该数组映射为一个二维网格图,数组的每个元素为一个结构体,保存网格图上对应的网格放置的节点信息,包括节点的父节点和子节点、节点的深度、节点所要放置的3d模块的类型(关键模块或道路模块)和位置信息。数组维度的大小限定了要生成的随机地图的大致范围。

步骤2:在网格图中选取一个节点为起始节点,起始节点相当于树的根节点,将其深度设置为0,创建一个搜索列表,将初始节点加入搜索列表,列表中的元素相当于树的叶节点,根据搜索列表中节点的深度由小到大随机扩展其子节点。

步骤3,将上、下、左、右四个方向随机排列(如随机出的方向顺序为上,右,下,左),从搜索列表中取出深度值最小的节点(将其从搜索列表中删除),按照随机出的方向顺序来扩展其子节点,对于每个方向产生一个随机数,并将该随机数与一个可设定的数值(由用户根据每个节点需要扩展的子节点的数量设定)进行比较来决定这个方向是否拓展子节点,若比较的结果是往该方向拓展子节点,则判断该子节点是否位于网格图范围内以及该子节点对应的网格是否已有节点信息,将不符合要求的子节点销毁,符合要求的子节点深度设置为其父节点深度加1,并以一个可设定的概率(由用户根据需求设定)设置为关键节点,把没有设置为关键节点的子节点加入搜索列表。

步骤4:判断现在已有的关键节点的数量和搜索列表中的节点的数量之和是否大于设定的关键节点的数量,若是,将搜索列表中的所有节点设置为关键节点,若否,重复步骤3,直到搜索列表中的元素个数为零。检查关键节点的数量,如果关键节点的数量未达到设定值,则清空网格信息,重新回到步骤2。

步骤5:经过步骤4会得到关键节点和连接这些关键节点的道路节点,根据父节点和子节点在二维网格图的相对位置确定连接关键节点的道路节点应放置的道路模块的形状。例如,假设父节点在节点的左方,有两个子节点,分别在该节点的下和右方,则该节点应该放置道路模块为“t”型模块。

步骤6:根据步骤5所产生的网格图信息,由初始节点开始拼接3d地图模块,按照深度从小到大的顺序遍历所有的节点,拼接其对应的地图模块,形成随机地图。

本发明的有益效果是:与从一个模块开始延伸出去的方式相比,本发明能在模块数较多的情况下显著减少生成时间;可以通过设置随机出子节点的概率来控制地图的疏密程度;通过在随机出子节点的同时以一定的概率将道路节点设置为关键节点可以减少无效的随机过程,加快地图的生成,并且生成的地图的结构趋于合理,大大减小了地图的模块在一个地方集聚的概率。

附图说明

图1是网格图的随机生成过程图;

图2是最终生成的网格图;

图3是生成3d游戏随机地图的流程图。

具体实施方式

下面结合附图和具体实施例对本发明作进一步详细说明。

本发明给出了一种3d游戏随机地图的生成方法,图3为生成地图的流程图,本发明方法包括以下几个步骤:

步骤1,首先创建一个二维数组p,来保存节点信息,数组元素是一个结构体,包括节点本身的位置,深度,父节点和子节点以及对应的3d模块类型信息。二维数组映射出一个网格图,如图1所示,例如给定的要生成的关键模块的数量等于8,一般取含有给定数量5倍大小网格的网格图能得到不错的效果,本例取得网格大小为7乘7。将节点的二维数组索引设置为节点的位置坐标,两个节点的方向关系可以用它们的位置坐标之差来表示,定义位置向量设为终止节点的位置坐标减去起始节点的位置坐标,规定了上,下,左,右四个方向向量,分别用(0,1),(0,-1),(-1,0),(1,0)来表示。

步骤2,在网格中取一点为初始节点,考虑到地图的主体形状最好集中在一个区域的范围内,本例将初始节点设置在网格图的中心位置,将起始位置的节点深度设置为0。创建搜索列表,将起始节点加入搜索列表中,搜索列表中保存的是需要进一步搜索其子节点的节点。

步骤3,将上、下、左、右四个方向随机排列(例如:随机出的方向顺序为上,右,下,左),从搜索列表中取出深度值最小的节点(将其从搜索列表中删除),按照随机出的方向顺序来扩展其子节点,对于每个方向产生一个随机数,并将该随机数与设定的数值(例如:0.3)进行比较,若大于设定值,则表明往该方向上拓展子节点,进一步判断该子节点是否符合位于网格图范围内以及该子节点对应的网格未被其他节点占住的要求,删掉不合要求的子节点,将符合要求的子节点以一定概率(例如:0.5)设置为关键节点,将未被设置成关键节点的子节点加入搜索列表。

步骤4,计算搜索列表中节点个数和关键节点的个数之和,判断其是否大于等于关键节点数量的设定值,若是,按深度顺序取出搜索列表中的全部元素,将其置为关键节点,若否,重复步骤3,直到搜索列表中的节点个数为零。然后检查关键节点的个数,如果房间节点的个数未达到设定值,则清除网格数据,重新回到步骤2。

步骤5,经过步骤4得到一系列关键节点和一系列连接关键节点的道路节点,如图1所示,正方形表示关键节点,圆形表示道路节点,数字表示节点的深度。现在来确定各节点对应的3d模型信息,对于关键模块,只需调整方向即可,对于道路模块,首先得确定道路节点所对应的道路模型。用一个4位二进制数a表示哪个方向上存在节点,0001表示该节点右边存在节点,0010表示该节点上方存在节点,0100表示该节点左边存在节点,1000表示该节点下边存在节点。将a的初值设为0,遍历a点的父节点和所有子节点,计算他们的相对位置,将对应的4位二进制数加到a上,对于图1的p[3][3]节点来说,下,右,上三个方向上存在节点,那么此时a的值为1000加0001加上0010等于1011。换算成整数值为11,由图可知该点对应的模块应为形,也就是说当a的值为11时对应的道路模块为形,依次类推,建立所有的道路模型与a的对应关系,然后通过计算每个道路节点的a值就可以确定其对应的道路模块。

步骤6:根据步骤5所产生的网格图信息,由初始节点开始拼接3d地图模块,按照深度从小到大的顺序遍历生成的节点树的所有元素后形成所需的随机地图。

本发明所述的3d游戏随机地图生成方法采取的技术方案是:先生成二维网格图,用以保存3d模块的相对位置信息以及每个网格节点应放置的3d模块信息,然后从一个起始节点出发,随机出其子节点,将子节点按一定概率设置为关键节点,最后形成关键节点和连接房间节点的道路节点,根据父节点和子节点的位置情况,确定道路节点对应的3d模型,最后根据网格图信息,从起始节点开始,取相应的3d模块完成拼接,得到3d随机地图。

图1显示了一个简单的随机地图实例,设定的关键节点的数量为8,结合表1,首先将p[3][3]加入搜索列表,将其深度设置为0,列表节点数量和关键数量之和为1,小于8,所以从搜索列表中取出p[3][3](将其从搜索列表中删除),随机出p[2][3]、p[3][4]和p[4][3]三个子节点,将他们的深度设置为1,这三个节点都没有被随机成房间节点,将这三个节点加入搜索列表,列表节点数和关键节点数量之和为3,小于8,继续从搜索列表中取出p[2][3],随机出子节点p[1][3]和p[2][4],将深度设置为2,p[2][4]被随机成了房间节点,将p[1][3]加入搜索列表。此时列表元素如表1所示,列表节点数和关键节点数量之和为4,小于8,继续从搜索列表中取出p[3][4]节点,随机出的子节点为p[2][4]和p[3][5],将其深度设置为2,p[2][4]已经是p[2][3]的子节点,故将p[2][4]从p[3][4]的子节点中删除,将p[3][5]加入搜索列表,此时列表节点数和关键节点数量之和为4,小于8,继续从搜索列表中取出p[4][3],随机出p[4][2]和p[5][3],将其深度设置为2,p[5][3]被随机成了关键节点,将p[4][2]加入搜索列表,此时列表节点数和关键节点数量之和为5,小于8,继续取出搜索列表中深度最小的元素p[1][3],随机出p[1][2]和p[0][3],将其深度设置为3,p[1][2]被随机成关键节点,将p[0][3]加入到搜索列表,此时列表节点数和关键节点数量之和为6,小于8,继续取搜索列表中深度最小的元素p[3][5],随机出p[3][6]和p[4][5],将其深度设置为3,p[3][6]被随机成为房间节点,将p[4][5]加入搜索列表。此时列表节点数和关键节点数量之和为7,小于8,继续取搜索列表中深度最小的元素p[4][2],随机出p[4][1]和p[5][2],将其深度设置为3,两者均未被随机成关键节点,将两者加入搜索列表,此时列表节点数和关键节点数量之和为8等于设定值。将搜索列表中的所有节点都设置为关键节点,结束循环,最终生成的网格图如图2所示。根据节点的父节点和子节点的信息,道路节点所对应的道路模块的形状如表2所示。

表1随机生成网格图的过程中搜索列表和关键节点情况示意图

表2道路节点所对应的道路模型

最后根据网格图信息,从起始节点开始,取相应的3d模块完成拼接,得到3d随机地图。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1