2012-06-12 30 views
0

我有一个像宠物小精灵或塞尔达一样的2D自顶向下的45度游戏。由于对象的y值决定了它的深度,因此需要按照y值的顺序绘制对象。所以,当你站在一棵树后面时,树就会画在你的播放器的顶部,看起来就像站在树后面一样。在呈现之前按y值排序对象?

我目前的设计是绘制一排瓷砖,然后画出所有站在那一排上的玩家,然后画下一行,然后画出所有站在其上的玩家。这样,任何具有比玩家更高的y值的图块都将被绘制在它们的前方以模拟深度。

但是,我的玩家目前是一个std::vector的对象,只需在绘制完所有贴图后进行迭代和绘制即可。对于我的方法来说,我必须迭代瓦片的每一行的向量,并且只在它们位于当前行上时呈现,或者按照每个帧的y值对每个玩家进行排序。这两种方法似乎都是CPU密集型的,也许我过度思考它,并且在这种类型的游戏中有一种更简单的模拟深度的方法。

编辑: 这个游戏是一个MMORPG类型的游戏,所以有可能是许多玩家/ NPC的走动这就是为什么我需要一个非常有效的方法。

想法或意见将不胜感激!

感谢

回答

0

(Disgregard我原来的建议,如果你读它。这是愚蠢的)

据我所知,你基本上每次迭代排序容器您呈现帧;会有一个计算惩罚,并且不得不每次都进行一次复制和排序不会那么糟糕(O(N log N)排序时间,我猜测)。

一个聪明的数据结构可能会帮助你;例如,一个包含游戏对象向量作为每个元素的数组。数组中的每个元素表示一行平铺网格,并且您遍历对象矢量并将它们放入深度缓冲区数组(这将花费大约O(N)时间)。然后,只需遍历表示每一行的向量并依次绘制每个对象,再次O(N)。

有可能更聪明的z缓冲技术,但我会留给读者一个练习。

1

您可以使用std::setstd::map而不是vector来保持对象的排序顺序。不幸的是,您无法简单地修改自己的位置,每次需要更改坐标时都必须移除/插入。

0

只要你不是试图根据其他标准对玩家进行排序,那么每次你想通过它们迭代你的玩家时,你都可以通过y坐标排序玩家。只要你使用一种按线性时间运行的排序,当输入大部分排序时,你甚至可能不会为此步骤产生O(n log n)时间。我在这里假设你的队员变化缓慢,他们的Y坐标也会慢慢变化。如果是这种情况,那么每当你需要对向量进行排序时,它就已经被大多数排序了,而像Smooth sort或Tim sort这样的东西将会以线性时间运行。

对于C++,看起来您可以找到Tim排序的实现here

0

如果您有空间,另一个选择是创建一个玩家列表数组,其索引是行号,数组包含该行玩家的集合。

正如我所提到的,这将需要一点额外的内存,并且每次玩家移动到不同的行时都会有一些令人兴奋的事情发生,但是绘图仅仅是遍历行的问题,并绘制了存在的玩家在那一行。