由于您并没有真正提供有关您的特定实现的详细信息,因此我只会为您提供一种处理此类游戏的通用方法。
首先,您需要为您的游戏世界定义一个“活动”区域——这将是需要模拟的世界区域(即该区域中的实体将移动并与世界交互)。
您的世界布局可能如下所示:
![示例世界](https://i.stack.imgur.com/j4r7s.png)
在此示例中,您的世界是灰色块,并超出屏幕边界(即黑框)。红框表示活动区域 - 请注意,它超出了显示的大小,但并未覆盖整个世界。该区域的大小将取决于您的具体实施/需求。
活动区域通常会随着您的玩家移动,因此可以很容易地表示为与玩家的距离(在两个方向上)。
基本思想是实体(蓝色)仅在它们位于活动区域内时被模拟。活动区域右侧的所有实体在进入之前都应该处于非活动状态,此时他们的模拟可以开始 - 因此,活动区域应该扩展到显示区域的右侧一些量,以便实体有一些初始时间在显示之前运行他们的模拟。一旦实体离开活动区域(左侧),它们就可以停止模拟 - 并在需要时被移除。
所以在示例图像中:
- E1已经通过活动区域,不再需要(可以禁用/删除)
- E2处于活动状态且可见(当前显示)
- E3处于活动状态但尚不可见
- E4和E5尚未激活,只有在玩家靠近它们进入激活区域时才会激活
至于如何处理实体,这取决于世界的大小,实体的数量等。
一种方法是在实体进入活动区域后创建/加载实体 - 在这种情况下,实体应该延伸到显示右侧足够远,以便在进入显示区域之前有足够的时间来创建/加载。对于可能有数千个实体的大型世界,这是最好的方法。在这种情况下,您可能还需要对您的世界进行某种细分,以便您可以在不检查每个实体的情况下从处理中排除大量实体 - 一组固定大小的“块”,每个包含其中的实体,可以工作在大多数情况下,对于简单的 2D 横向滚动条来说都很好。
另一种方法是在开始时加载所有对象,并且仅在它们进入活动区域后对其执行模拟更新(例如物理、运动、碰撞检测)。这种方法适用于较小的世界,并提供更简单的实现。