狡猾的方式绘制星空

时间:2010-11-06 12:43:57

标签: algorithm

我正在开发一款游戏,我想出了一个相当有趣的问题:聪明的方法来绘制星空。

这是一款2D游戏,因此动作可以在X和Y方向滚动。此外,我们可以调整比例以显示更多或更少的游戏区域。我也希望星空有假视差来给人一种深度印象。

现在,我正在以传统的方式做这件事,拥有大量的星星,每个星星都被“深度”因素标记。为了绘制,我根据相机位置乘以“深度”来翻译每个星星,因此一些星星会移动很多,有些星星移动一点。这一切都很好,但当然因为我的阵列中有一定数量的星星,所以当相机移动太远或者我们缩小太多时会出现问题。这一切都会奏效,但涉及大量代码和特殊情况。

这冒犯了我的优雅感。有更好的方法来实现这一目标。

我考虑过程序性地生成我的星星,这使我可以拥有无​​限数量:例如通过使用固定种子和PRNG来确定坐标。我需要将天空划分为瓷砖,通过散列瓷砖坐标生成种子,然后绘制每个瓷砖100颗星。这允许我无限期地向所有方向延伸我的星空,同时仍然只需要考虑可见的瓦片 - 但这不适用于“深度”因子,因为这允许星星在他们的瓦片外偏离。我可以使用这种算法简单地使用多层非视差星场,但这让我感到作弊。

当然,我需要在每一帧都做这一切,所以它必须快速。

你们都觉得怎么样?

5 个答案:

答案 0 :(得分:2)

有几层星星。

对于每一层,使用种子随机数生成器(或只是一个数组)来生成星和下一个星之间的空白量(泊松分布,如果你想对它挑剔)。你希望星星非常稀疏,所以空白区域通常会超过整行。显然,背层将比前面的层更密集。

使用它为每个(比如说)两个屏幕宽度给自己几块瓷砖。通过跟踪每个图层的“第一个”星的位置来滚动星空。

玩家不会注意到平铺,因为您为每个图层以不同的速率滚动图块,特别是如果您使用几个相当稀疏的图层。

答案 1 :(得分:1)

由于背景中的星星移动速度不如前景中的星星快,因此您可以为背景制作多层图块,并在有时间的情况下将其替换为单层图块。哦,如何重复背景图层中的图案?这可能允许您预生成所有背景图块 - 您仍然可以将它们移动到高度并使用随机偏移覆盖多个图块,以使其看起来是随机的。

答案 2 :(得分:1)

在X和Y周围包裹星形字段有什么问题吗?由于你的深度,环绕距离应该取决于深度,但你可以做到这一点。每个记录的恒星(x,y,深度)应出现在所有点

[x + j * S *深度,y + k * S *深度]

适用于所有整数jkS是一个环绕参数。如果S为1,则立即进行环绕,并且所有星星总是显示在某处。如果S更高,则不会立即发生环绕,并且屏幕上会显示一些星星。您可能希望S足够大,以确保在最大缩小时不会重复。

答案 3 :(得分:0)

每个帧,在一个位图/图层上渲染星星。它们只是点,因此它比使用任何多层算法更快。

现在你需要一个无限的二维网格的3D盒子,里面装满了有限数量的星星。对于每个框,您可以使用其网格坐标定义单个RANDOM_SEED值。每个方框中的星星都可以即时生成。

请记住在缩放时更正透视:每个3D框都有一个近矩形(正面)和一个远矩形。每当远视角或近矩形在视图中缩小时,您将看到更多相邻框的星星。

你的远长方形不应小于近矩形宽度的一半,否则可能会很麻烦:你可能需要扫描巨大的星星列表,其中大部分都是超出界限的。您可以通过其他尺寸和深度的3D框的2D网格实现远矩形背后的恒星。

答案 4 :(得分:0)

为什么不组合星空3D框的坐标来形成随机数种子?如果要生成不同的Universe,请使用全局“调整”。这样您就不需要跟踪您看不到的框,因为内容是按其位置固定的。