2

我正在为 Beat'em Up 游戏制作我的 2D 引擎(Castle Crashers 是我所说的 Beat'em Up 或 Brawler 类型的游戏)。

我将支持 2D 精灵和 2D 粒子发射器。现在这一切都在引擎中完成。但是我遇到了一个问题,我想请教一下:

这是关于“空间”管理的,我认为是做一些事情,如图所示:

替代文字 http://img337.imageshack.us/img337/9162/spacingprototype1.png

我的想法是制作一个网格(空间散列或网格),我的粒子发射器 / 2D 精灵将居住的地面。在我的图片中,我已经列举了从 1 到 N 的这个插槽(不一定是 35,它只是为了展示目的)。我的想法是按从 0 到 N 的顺序绘制“GameElements”(Sprites/Emitters)(从存储桶 0 到存储桶 N),然后我会让它们在屏幕上正确重叠显示(从后到前)。

我知道这可以通过比较每个元素的下 Y 轴并执行“快速排序”来完成,但是拥有网格可以让我以更好的方式执行碰撞检测,如果我执行 A* 之类的操作来实现某种人工智能,它也可以帮助我。

4

3 回答 3

5

如果您想对需要相互测试的对象数量进行某种优化,您可能需要考虑使用四叉树 http://en.wikipedia.org/wiki/Quadtree

这个想法是将屏幕划分为 4 个节点,将所有项目放在它们所属的节点中,然后将刚刚创建的节点划分为另外 4 个节点,如果其中有需要测试的精灵/项目/任何东西。继续这样做,直到节点中的项目达到一定大小或数量。

然后,您可以询问顶级节点是否包含您要测试的项目。然后,该节点将询问子节点是否包含该项目,然后它们将询问他们的孩子。这样就可以跳过大部分屏幕(如果它位于子 00 中,您可以跳过子 01、10 和 11)。然后,您将获得一个项目列表,您可以在需要时执行更具体的碰撞检测。

如果你让它可视化,它看起来有点像这样:

替代文字 http://geodata.ethz.ch/geovite/tutorials/L2GeodataStructuresAndDataModels/en/images/quadtree.gif

于 2009-11-02T11:55:12.500 回答
1

将它们发射到 Z 缓冲区并让它担心。

如果您发现将来它太慢(显然通过分析),那么请考虑对其进行优化。

采取最简单的解决方案并继续前进。

于 2009-11-02T11:58:53.797 回答
1

如果您有两个精灵占据网格中的同一个框,您的方法将失败。假设你有两个敌人都站在同一个盒子里。一个人稍微站在另一个人的前面。你先画哪个?您将需要两种算法 - 一种将精灵划分为网格,第二种查看给定网格框中所有精灵的 z 坐标并根据该值绘制它们。

一个更简单的方法是拥有所有精灵的单一集合。它应该存储按 z 坐标排序的所有精灵(从列表头部的屏幕背面到背面的屏幕前面)。循环遍历集合并绘制出现的每个精灵。当一个精灵移入或移出屏幕(即它的 z 坐标发生变化)时,您可以执行一个非常简单的排序来移动集合中的单个精灵。继续与列表中的下一个精灵交换它,直到下一个精灵的 z 坐标大于/小于(视情况而定)更改后的精灵坐标。

于 2009-11-02T12:17:51.120 回答