二维视差的方法

在2D滚动平台游戏中,最有效的方法是什么,或者知道哪些视差深度应该被绘制?

下面的方法描述了试图知道哪些东西在附近,以便它们可以被绘制/绘制。 计算出哪些视差项目在附近的问题是,在计算它们的位置之前,您不知道它们在哪里。

原始post

我有一个二维数组Set<Thing>[][] ,用于存储在滚动的2D平台上的每个屏幕上出现的Thing 。 我只用它来查看当前正在渲染的位置,以免我更新不相关的对象。

我翻译世界坐标,将它们除以屏幕大小(向下舍入),然后可以查找该屏幕上的所有项目。 例如,如果屏幕是320×240像素,我查找世界坐标400,50然后400/320 = 1和50/240 = 0,所以我查找things[1][0]并更新该条目中的所有东西。 如果有物体可以移动,移动后将它们存储在正确的位置。

当有视差深度时,有什么办法可以使用这个系统吗? IE中,视差深度为1的东西无限远(因此总是出现在屏幕坐标中的相同位置),视差深度为0的东西被固定在前景。

我猜这是不可能的,因为远远超过前景将会在多个屏幕中。

还有什么其他的方法? 我见过一位经验丰富的游戏开发人员使用“滚动速度”而不是视差深度,他将相机移动距离的倒数乘以该速度来移动景物。 在这个模型中,我可以根据其他任何移动项目来处理风景,并且在移动时将其存储在二维数组中的相邻条目中,但是它是如何进入“正确的”数组槽的呢? IE,如果距离很远,可以从左边或者右边接近,我不会提前知道。

我很困惑!

这取决于你是否有:

  1. 只有less量的不同级别的视差深度
  2. 连续的(即接近无限的)不同深度的数量

对于1),可能是最有效和最简单的方法来独立处理各个级别,并查询每个级别的合适的矩形。

2)更难。 您正在有效地查询3D空间的一个子集。 如果将parallex的深度解释为“scroll rate”,那么这个形状实际上是一个高度倾斜的长方体(长方体的背部固定在infinte depth =零滚动率平面的相同位置)。 对此的策略:

  • 您可以使用某种forms的空间分区algorithm来有效地查询此形状(BSP树,八叉树等),但请注意,这些algorithm可能需要进行一些调整,因为它们通常不是针对偏斜长方体查询devise的:-)。
  • 仅在偏斜长方体的轴alignment边界框内查询。 如果长方体在对角线上实际上是倾斜的,这将会变得低效,但是仍然比查询所有事情要好。 你可以使用你当前的Set<Thing>[][] – 从当前屏幕位置到[0,0]屏幕(包含无限距离/零滚动率背景)的矩形中查询所有内容。
  • 一些混合模型,您可以查询覆盖整个长方体的子区域。 这可能是一个基于网格的结构(例如,一个大的3Darrays,可以将滚动速率的尺寸细分为从0.0到1.0的5-10个不同的范围)。 这就像你当前的方法的3D版本,即你可以有一个Set<Thing>[][][]作为一个数据结构

无论哪种方式,我认为“滚动速度”将是这方面最简便的方式,而不是“深度”。 这将使math和几何更容易:-)