6

我们可以使用什么方法来生成随机隧道,类似于经典直升机游戏中的方法?除此之外,它应该是平滑的并允许您在其中导航,同时看起来尽可能自然(不太对称但也不会过度扭曲),它还应该:

  1. 最重要的是 - 是无限的,让我可以及时控制它的厚度 - 在我认为合适的时候让它变窄或变宽;
  2. 理想情况下,应该可以高效地生成平滑曲线,而不是上面游戏中的矩形;
  3. 我应该能够提前知道它的界限是什么,这样我就可以检测到碰撞并在隧道内产生能量;
  4. 欢迎任何其他可以让您对其进行更多控制或提供优化可能性的属性。

注意: 我不是在问哪个最好或该游戏使用什么,这可能会引发广泛的讨论并且会是主观的,我只是要求其他人知道或以前使用过甚至认为它们可能有效的一些方法。仅此而已,我可以从那里拿走它。

还在gamedev 上问过。我认为它适合这两个地方,因为它既是一个算法问题,也是一个游戏开发问题,IMO。

4

2 回答 2

3

我认为您可以将贝塞尔曲线用于隧道壁,因为它们具有曲线的每一端都与该端最后两个控制点之间的线段相切的特性。这意味着可以懒惰地生成曲线,随时添加它们,而不会产生尖角。您只需要缓冲一个屏幕外片段。一旦它的最左边出现在屏幕上,就创建下一个屏幕外片段。

如果使用三次贝塞尔曲线,则需要 4 个控制点。第一个必须与前一段的最后一个控制点相同;为了保持交界处的平滑度,第二个需要位于包含前一段最后 2 个控制点的线上的某个位置;第 4 个将是您希望这条曲线结束的地方;第三个可能可以自由选择。(您可能希望在第 1 点和第 4 点之间保持水平,以避免曲线“翻倍”的可能性。)

贝塞尔曲线还有 2 个其他属性可以简化您的实现:

  • 曲线完全包含在由控制点定义的凸包内,因此很容易确保顶部曲线和底部曲线之间存在间隙。
  • 您可以随时拆分一个贝塞尔曲线以生成 2 个子贝塞尔曲线。这对于光栅化/线性化很方便。

编辑:用“凸壳”替换“边界框”。

于 2012-09-28T20:52:24.530 回答
2

确定隧道的宽度(它可能会随着距离而减小),然后在随机高度放置 2 个控制点,但要确保与前一对或点的垂直偏移足够小,以便直升机进行机动. 继续在相等距离处添加控制点:

     _  
_         _    _

     _         _
_         _    

接下来,您需要找到中间点。我会使用单调三次插值,它保证所有中间点总是在控制点之间,永远不会更低或更高。这是我用 JavaScript 制作的演示:http: //explored.tk/experiments/monotone/

UPD:或者您可以生成一条这样的曲线,然后围绕它对称地绘制隧道边界。

于 2012-09-28T21:20:58.217 回答