如何随机放置对象作为玩家在无限远地图中移动而不重叠?

时间:2015-11-20 13:30:18

标签: c# mobile random procedural-generation

我试图制作一个游戏,其中玩家只能在无限远地图中向前移动,并且路径(只是它们之类的东西,如点,路径只是视觉)是程序生成的。我希望这些路径具有不同的长度(enter image description here,但只生成所选路径的分支)。

这就是我如何生成没有重叠的分支:

List<Vector3> everyPos; //predetermined position

public void Spawn(int amount)
{
    List<Vector3> possiblePos = new List<Vector3>(everyPos);

    for (int i = 0; i < amount; i++)
    {
        int index = Random(0, possiblePos.Count);          //Find a random position
        SpawnObjectAt(currentPosition+possiblePos[index]));//Create a point there
        possiblePos.RemoveAt(index);                       //Remove that position from the list
    }
}

问题是,something like the tree of life

红色是玩家开始的地方,绿色可能是第一步中产生的位置。

如果在1和2处产生2点,玩家选择point1,那么第二次可能的位置将是黑区中的一个点,包括point2,所以如果我继续那么将会最终重叠。

我该如何避免这种情况?我制作了一款手机游戏,所以我不想缓存每一点。任何帮助将非常感激!谢谢!

这是一款小型网络游戏,其功能与我想要实现的功能类似:newgrounds.com/portal/view/592325 /

1 个答案:

答案 0 :(得分:0)

这是尝试回答的问题,但老实说,您需要提供更多信息。

根据您所写的语言,您可以采用不同的方式处理。您可能需要动态分配,但现在让我们假设,因为您的想法非常小,您可以在编译时预先执行一个大型数组。

我假设你知道如何制作一个数组,所以创建一个说长度为500的数组来开始。如果你想像在游戏中一样“生成”一个链接,你只需要一个随机函数,(我认为几乎每种语言都有一个内置库),你需要做一些数学运算。

您使用的任何语言肯定都有内置的图形库,或者您可以使用流行的易用语言。我只是画一张照片来说清楚。

enter image description here

有很多方法可以用数学的方式做到这一点,如图所示,使用角度,例如,最简单的方法,但只是按照方框。

如果你以前使用过图形,你知道矢量是什么,如果没有,你需要学习。在此图像(0,1)(1,0)(1,1)等中显示的9个向量可以创建为矢量对象,甚至可以存储为单独的整数。

要让你的节点“移动”到另一条路径,你可以简单地做一个rand 1-9,然后将结果与9个可能的向量之一相关联,然后将它们添加到你的位置向量中。最简单的方法是在数组中执行此操作,并使用rand int作为索引。在大多数c派生语言中,您可以这样做:

positionVector += changeVectorArray[rand(1,9)];

然后,您可以通过9个向量之一增加位置向量,如上所示。

制作“路径”的最简单方法是在添加更改向量之前复制位置,然后将所有更改按顺序存储在另一个“路径”数组中。

要在屏幕上显示路径,只需在路径数组的第一个,第二个和第三个,第三个和第四个元素之间画一条线。如果我没有弄错的话,这个(连接线)公式是离散数学,如果你愿意,你可以做更复杂的路径形状,但你得到了要点。

至少应该让你失望。没有更多信息,我无法真正帮助你。

我可以用切线来描述一些不同的方法,你可以使这种情况发生不同,但如果你只是要求细节,它可能更容易。

enter image description here

编辑&gt;&GT;&GT;

继续这个答案,是的,现在看一下,节点肯定会重叠。要解决这个问题,您可以使用碰撞检测,每次生成一个新的“位置”,然后添加它并绘制线条,您必须循环遍历数组,如下所示:

boolean copy = true;
for(int i = 0; i < getLength(pathArray); i++){

     if( newVector == pathArray[i]){
        copy=false;
     }
}

然后,当然,如果复制仍为真,则将新位置复制到pathArray中。注意:整个解决方案都很糟糕,随着阵列变大,您的程序将花费更长的时间来搜索该循环。这可能也不能保证路径朝一个方向发展,但很可能。请注意,即使位置矢量不能彼此重叠,这些线仍然能够相互重叠。

考虑到所有这些,我认为它会起作用,优化取决于您。我建议使用离散公式可能有更高效的解决方案。你也可以使用这样的公式使路径走向特定方向并做其他更复杂的事情。

如果你想让路径走向一个特定的方向,你也可以很容易地在你的随机卷上应用约束。但是有很多方法可以做到这一点,我无法开始解释。你可以使用google路径寻找算法。

祝你好运。