Questions tagged «procedural-generation»

程序生成是基于算法和计算而不是手动构建内容的过程。

2
2d程序宇宙生成
我想创建一个平坦的宇宙,首先整个宇宙是空白的。 那将由视差滚动星云背景图像表示。 我要做的是将行星表示为宇宙中的圆盘状物体。它们可以是各种尺寸。 圆盘的内部将由一个陆地组成,然后外部将是一个水体,其后是空气。 程序上创建这些瓷砖的最佳方法是什么,例如空气将由各种气体以及各种矿产和资源的土地组成。 我的第一个想法是创建纹理图像,然后从这些纹理中划出圆圈,但是问题是这些纹理必须水平和垂直地包裹。是否有完整的程序方式来做到这一点?

8
如何为地图生成创建平铺的固体噪声?
大家好,我试图弄清楚如何在代码中生成可分割的分形(对于游戏地图,但这无关紧要)。我一直在尝试修改GIMP附带的Solid Noise插件(我对如何该代码有效),但我无法让我正常工作。 到目前为止,我修改过的代码(Java) GIMP的固体噪声模块,我的代码基于(C) 这是我想要实现的目标,但这 就是我得到的目标 因此,如果任何人都可以看到我做错了什么,或者有建议我可以做些不同的事情,我将不胜感激。提前致谢。 如果我要问的是很多事情,或者是人生中的巨大失败,我深表歉意。

1
无限级别的过程生成
有什么好的方法可以以程序方式生成无限2d水平?级别可以限制在任一维度上,但不一定。 到目前为止,对我来说最有意义的方法是使用基于网格的半径。例如,将游戏区域划分为具有一定大小正方形的网格,然后在玩家周围的半径内加载X个正方形。然后,当玩家移动到另一个正方形时,建立下一个集合并将其放下更远的地方(不需要持久地探索区域。)在构建正方形时,它包含随机排列的对象。当物体离开正方形的外圈时,它们将从世界上移开。有更好或不同的方法吗?或者,如果这是一种好方法,那么潜在的问题是什么? 为了讨论的缘故,您可以将其视为自上而下的小行星场,其上散布着力量起伏等。

1
基于图块的2D Platformer的地形生成
我目前在某种程度上正在开发类似于Terraria的基于图块的2D平台游戏,尽管我在地形生成方面遇到了困难。我完成了一些基础工作,尽管它们没有任何有用的作用。 我尝试了几种不同的技术,例如Perlin Noise,并了解了其他一些技术,例如Midpoint Displacement,尽管我不确定哪种方法最好,或者无法结合使用不同的技术来生成不同的区域。(例如中点位移表示地形的一般形状,Perlin Noise表示洞穴的形状。) 我已经找到了一个很好的解释,说明如何使用“ 意外噪声库”将其分层,尽管它是C ++语言,而且我不了解足够的C ++语言将其编译成可从C#中使用的DLL。尽管我不知道如何将两个效果(通用基的渐变,然后是详细的分形)合并在一起,但我尝试用C#复制它。 目前,我正在使用等离子分形,结果差异很大。例如,它可以生成几乎没有任何表面的地形,也可以生成根本没有任何表面的地形。 好的地图的示例会有所改进,但会更好。(黑色为实心,白色为空): 还有一个可怕的地图的例子。(黑色为实心,白色为空): 基本上,我要问的是,什么是生成地形的更好方法,或者强迫它确保有合理的表面积,并且尽快生成。或者,或者,如何使用C#实现与“意外噪声库”相同的结果。 任何例子将不胜感激。

4
程序生成特定区域的建筑物
我和一个团队正在开发一个工厂建造者游戏,该游戏在游戏开始时为玩家提供一个随机的工厂。为了确保有一种“公平”的感觉,理想情况下,随机生成的工厂的面积应在(占位符值)30的几个单位内。 编写满足这些规范的基本随机矩形生成器相对简单,但我们的目标是使工厂变得更加复杂,可能由2个,3个甚至4个相交的矩形组成,从而产生更复杂的形状(例如L, U和O形建筑物)。 我尝试生成一个随机矩形,然后使用基本代数填充第二个矩形,但是到目前为止,我并没有实现超过2个矩形的运气,即使如此,我对仅2个矩形设计的结果也不满意。 一些更相关的信息:2D自上而下一些机制是factorio样式,因此房间应该具有合理的长度和宽度,以便为机械留出空间(目前在Java和Lua中使用)(可以根据需要使用内置的库) 提前致谢! 编辑:当我说“好”或“坏”的输出时,不良的输出将是具有播放器无法使用的空间的任何输出。工厂形状限制了玩家可以放置工厂机器(例如传送带)的位置。理想情况下,工厂的区域不应只有1-2个块的宽度,形状不应该是一个或两个大的矩形,而将1-2个块的线“垂悬”到一侧。一个好的输出是所有地板空间都是“可行的”,因此所有区域至少应为3-4块宽。好的输出并不一定总是很复杂(可以使用1或2个矩形),但如果由超过1-2个矩形组成,则输出的机会就很大。

3
“动态生成”和“过程生成”之间有什么区别?
当我想到一个动态生成的游戏时,我会想到诸如暗黑破坏神之类的随机生成关卡。当我想到程序生成的游戏时,我想到了《飞扬的小鸟》和其他无限跑步者。 但是这两个都只是随机化一个级别。是程序生成的游戏不断被生成,而动态生成的游戏都被预先生成吗?还是这些术语可以互换? 动态生成的游戏和程序生成的游戏有什么区别?

2
没有走廊和房间依赖性的地牢生成
我正在用游戏开始时创建的程序生成的世界制作游戏,其中包括由网格表示的多个区域(例如8x8、9x6,大小理想情况下是任意的)。这些区域应该通过依赖关系列表相互连接。 当在这两个区域之间至少有3个网格暴露时存在连接。在该3个空间连接区域的中间单元中是区域之间的门口: 我一直在尝试找到一种连接它们的方法,但是随着您需要同时考虑更多领域,它变得越来越复杂。 我已经尝试过一些纸张原型制作,虽然在视觉上进行打印是一个非常简单的过程,但是我还没有找到一套好的数学表达式可以通过代码以相同的效率放置房间。 这是我目前正在苦苦挣扎的“简单”示例: 区域“ a”需要连接到“ b”和“ c” 区域“ b”需要连接到“ a”和“ d” 区域“ c”需要连接到“ a”和“ d” 区域“ d”需要连接到“ b”和“ c” 为简单起见,请考虑按房间的出现顺序将它们放在列表中(我尝试过其他方法)。因此,我正在将此作为您的标准程序Dungeon Generation算法。 我们将“ a”放置在板上的任何位置,因为它是第一个区域。接下来,我们随机选择一堵墙,由于该墙没有任何连接,因此可以在其中放置“ b”: 现在我们需要放置“ c”,但是“ a”已经在板上,并且已经占用了墙,因此我们决定将其放在另一墙上。但是并不是每个位置都可以,因为“ d”即将到来,并且它也需要连接到“ b”和“ c”: 我尝试了一个可能的限制,即具有相同依赖性集的2个房间不能在相对的墙上,但是即使这样也不能保证成功: 在其他情况下,如果区域的大小不同,则可以在相对的墙壁上工作: 另外,不考虑使用过的墙是一个错误的假设,因为它排除了有效的解决方案: 我曾尝试寻找其他过程生成算法或类似算法的研究,例如“最佳矩形包装”和“图形布局”算法,但通常这些算法没有考虑到此问题的所有约束,并且很难混合在一起。 我考虑过很多方法,包括放置区域和回溯直到找到合适的位置,但是它们似乎非常依赖于反复试验,并且在计算方面非常昂贵。但是,鉴于对我提到的最后两个问题的广泛研究,这可能是唯一/最佳解决方案? 我只是想看看过去是否有人遇到过类似的问题,或者愿意帮助我解决这个问题,并为我提供一些有关应该从哪里开始算法的建议。或者,否则,我将不得不放松设置的约束。

3
如何在n个玩家之间平均分配十六进制网格?
我正在制作一个简单的基于十六进制网格的游戏,我希望地图在玩家之间平均分配。该地图是随机创建的,我希望玩家拥有大约相等数量的单元,且区域相对较小。例如,如果地图上有4个玩家和80个像元,则每个玩家将有约20个像元(不必精确定位)。另外,每个玩家的相邻单元格不得超过四个。也就是说,在生成地图时,最大的“块”不能超过四个单元。 我知道这对两个或三个玩家来说并不总是可能的(因为这类似于“为地图着色”的问题),我可以为他们做其他解决方案(例如创建可以解决问题的地图)。但是,对于四到八名球员,我该如何解决这个问题?

1
使程序生成的自上而下的景观变得有趣
我正在开发具有程序化世界的游戏。理想情况下,我想生成与《我的世界》世界一样美丽的风景。我的世界有峡谷,瀑布,山脉,起伏的丘陵和海洋等。但是由于这将是一种自上而下的游戏(实际上是3/4视角),所以我认为大多数游戏都是不可能的。主要原因是尝试从这个角度表示身高有多困难。塞尔达传说:通往过去的链接很好地创造了高度的错觉,但这很难在程序上重现,而且还引入了一些问题,例如最高的建筑物必须在地图的顶部。 因此,我想知道一些技巧,可以以自上而下的格式制作有趣的景观,而不必伪造第3维。(您不能在此游戏中创建或破坏地形,因此给了我们更多的灵活性。) 编辑:为了使事情更清楚一些,我正在尝试避免使用需要三维尺寸特征的世界。例如,我真的不能拥有连绵起伏的丘陵或山脉。可以添加哪些不需要伪造三维尺寸的景观特征?一个答案可能是增加河流,但这是显而易见的。

1
程序星场发生器
是否有人知道任何程序生成星场的代码? 理想情况下,我希望它是基于物理学的,这样我就可以拥有逼真的行星和卫星。最好的方法是使用C ++,开源并与Ogre3d兼容。 如果没有可用的内容,我不害怕编写大学论文中的代码。

4
如何加载球形行星及其区域?
我正在设计一个部分由行星探索组成的游戏。我想为它们使用伪随机生成,当我不得不加载它们而不是存储每个细节的时候,从定义的种子重新生成,这会太繁琐。因此,我将随机种子和玩家所做的修改(如果有)存储在文件中。 玩家必须能够从轨道上看到行星(细节水平非常低,然后下降到地面,缓慢增加他/她着陆区域的细节水平,并从另一侧卸下超出玩家视野的行星。 如果必须在平坦的地面上进行操作,则可以使用正方形块系统轻松进行操作。但是这里的问题是行星几乎是球体。 那么,在精确点附近加载地面细节(起伏和接地物体)的最佳方法是什么? 我虽然已经提出了两种解决方案,但是两者都有一个弱点: 1.将球切成正方形块。 一旦玩家离地面足够近,我只需要从他/她的位置改善最接近的正方形的细节即可。 如果这还不够,当玩家在地面上或真的离地面很近时,我仍然可以在子正方形中切割每个正方形以进行加载。 但是,正如您在图片上看到的那样,如果玩家尝试着陆,那将是一个问题:正方形变成非常细长的矩形,甚至最后一行都变成三角形,此外还要加载很多东西,一代似乎会扭曲。 2.从二十面体开始。 在这里,我可以在玩家靠近时增加围绕他的位置的三角形镶嵌。 但是我不知道如何将三角形定位成比玩家的位置更近。我听说笛卡尔坐标在这种情况下可能有用,但我不知道如何使用它们。 我正在使用C ++ / OpenGL,所以这里要生成和加载的主要是表示表面浮雕和颜色/纹理的顶点。

3
半正确行星系统的程序生成
因此,您可以通过Google找到大量资源,也可以在此处使用有关如何程序生成整个星系的搜索资源。但是我找不到关于如何遵循这些标准的行星系统的任何有用资源: 该系统不必精确地模拟轨道,但应接近合理的轨道。我不在乎任何关心系统在20万年后的外观的仿真,轨道可能是坚如磐石。我面临的主要问题是如何随机生成一个看似合理的系统。当您的系统具有双星系统时,这变得特别有趣。 只是随机地创建轨道并不能构成一个合理的系统,最终您将得到明显无效的轨道。是的,我知道N体问题:),但这至少对我没有帮助,无法解决生成合理的系统程序的问题? 我认为您可以在行星的轨道上随机产生行星并给它们一个质量,然后使用N体数学来计算它们是否有效,如果不重新开始,并随机生成新的轨道,直到获得与之匹配的东西,但这将是非常低效的。

2
加快程序纹理的生成
最近,我开始研究在程序生成的太阳系中进行的游戏。经过一番学习之后(之前都没有使用Scala,OpenGL 2 ES或Libgdx进行过学习),我进行了一个基本的技术演示,您将围绕一个程序化纹理的行星旋转: 我遇到的问题是纹理生成的性能。我正在做的事情的简要概述:行星是已变形为球体的立方体。每一面都应用anxn(例如256 x 256)纹理,该纹理捆绑在一个8n xn纹理中,并发送到片段着色器。最后两个空格未使用,它们仅用于确保宽度为2的幂。使用在'Simplex'论文中链接的2012年更新的单纯形噪声算法,当前正在CPU上生成纹理。噪音消失了。我用来测试算法的场景包含两个球体:行星和背景。两者都使用由六个八度的3D单工噪声组成的灰度纹理,因此,例如,如果我们选择128x128作为纹理大小,则有128 x 128 x 6 x 2 x 6 =约120万个噪声函数调用。 您最接近地球的是屏幕快照中显示的内容,并且由于游戏的目标分辨率为1280x720,这意味着我希望使用512x512纹理。结合这样的事实,实际的纹理当然比基本噪声要复杂(白天和黑夜的纹理,将基于阳光和镜面反射的片段着色器混合在一起。我需要大洲的噪声,地形颜色变化,云层,城市的灯光等),而我们正在寻找的是512 x 512 x 6 x 3 x 15 =仅此星球就需要7,000万个噪声的东西。在最终游戏中,行星之间旅行时会有活动,所以等待5或10秒(可能是20秒)是可以接受的,因为我可以在旅行时计算背景纹理,尽管显然速度越快越好。 回到我们的测试场景,我的PC上的性能并不是太糟糕,尽管考虑到最终结果将比原来差60倍,但仍然太慢了: 128x128 : 0.1s 256x256 : 0.4s 512x512 : 1.7s 这是在我将所有对性能至关重要的代码移至Java之后的事情,因为在Scala中尝试这样做要差得多。但是,在我的手机(三星Galaxy S3)上运行它会产生更成问题的结果: 128x128 : 2s 256x256 : 7s 512x512 : 29s 已经太长了,这甚至没有考虑到最终版本将是分钟而不是秒的事实。显然需要做些事情。就个人而言,我看到了一些潜在的途径,尽管我并不特别热衷于其中任何一种: 不要预先计算纹理,而是让片段着色器计算所有内容。可能不可行,因为有一次我将背景作为具有像素着色器的全屏四边形,并且手机上的速度约为1 fps。 …

3
中点位移算法
在花了几个小时试图找出问题之后,这个问题主要是出于绝望。 如果您将视线移到上面的图片,您应该会看到我的中点位移算法算法正在(某种程度上)成功运行;产生一些连贯的噪声模式。 但是,它在图像上留下了黑色的虚线网格,我不知道为什么。我可以预见这是数学上的问题,但是我看不到它。也没有在任何在线资源中指出这是一个可能的问题;因此,对解决此错误的任何帮助将不胜感激。 unsigned char** mdp(unsigned char** base, unsigned base_n, unsigned char r) { size_t n = (2 * base_n) - 1; unsigned char** map = new unsigned char*[n]; for (unsigned i = 0; i < n; ++i) map[i] = new unsigned char[n]; // Resize // 1 0 1 // …

2
尽管使用了Time.deltaTime,但移动似乎与帧速率有关。
我有以下代码来计算在Unity中移动游戏对象所需的转换LateUpdate。据我了解,我对的使用Time.deltaTime应使最终的翻译帧速率独立(请注意CollisionDetection.Move(),仅用于进行射线广播)。 public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If we're ignoring gravity, then just …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.