打败游戏空间管理?

时间:2009-11-01 23:27:45

标签: game-engine

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

我将支持2D精灵和2D粒子发射器。现在这一切都在引擎中完成。但我想提出一个问题,我想征求意见:

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

alt text http://img337.imageshack.us/img337/9162/spacingprototype1.png

我的想法是创建一个网格(空间哈希或网格),我的粒子发射器/ 2D精灵将存在的地面。在我的图片中,我列举了从1到N的这个插槽,(不必是35,它只是为了显示目的)。我的想法是按照从0到N的顺序绘制“GameElements”(Sprites / Emitters)(从0到桶N),这样我就可以让它们在屏幕上正确重叠显示(从前到后)。 / p>

我知道这可以通过比较每个元素的下Y轴并执行“快速排序”来完成,但是让网格可以让我以更好的方式执行碰撞检测,如果我做了像A这样的事情*实施某种AI,它也可以帮助我。

3 个答案:

答案 0 :(得分:5)

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

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

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

如果你想让它看起来像,那就看起来像这样:

alt text http://geodata.ethz.ch/geovite/tutorials/L2GeodataStructuresAndDataModels/en/images/quadtree.gif

答案 1 :(得分:1)

将它们激活到Z缓冲区,让它担心它。

如果您发现将来它太慢(通过分析显然),那么请看优化它。

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

答案 2 :(得分:1)

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

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