基于磁贴的cocos2D-iPhone游戏的最佳Z订购方法?

时间:2012-01-23 22:14:31

标签: iphone opengl-es cocos2d-iphone zbuffer

我想用cocos2D制作等距的,基于平铺的iPhone游戏。

精灵需要在其他“精灵”的精灵之上绘制。我正在寻找最佳方法。

我想避免使用画家的算法,因为它涉及到每帧昂贵的所有精灵的排序。

GPU和cocos2D支持Z缓冲算法,所以这就是我想要使用的,但是有一个问题。一些精灵,例如建筑物,占据多个瓷砖。为这样的精灵分配Z值很困难。

这些是我想到的选项:

  1. 比较两座建筑物并确定哪一座建筑物“在前面”是 简单。因此可以对建筑物进行分类,然后根据其分配Z值 排序顺序。这与画家的情况没有什么不同 算法。不需要OpenGl ES Z缓冲区。
  2. 仅根据其位置为每个建筑物分配Z值 地图(不知道其他建筑物的位置)。我 发现这很困难。我认为这是可能的,但我还没有 能够想出一个公式。
  3. 对占据多个图块的图像使用多个精灵,所以 所有精灵的大小都完全相同。那么Z订单就可以了 根据精灵占用的图块轻松分配。该 这个解决方案的问题在于它使游戏逻辑更加强大 复杂。单个建筑物上的所有操作都必须如此 每个精灵都重复建造这座建筑物。我想 将每个对象视为一个单独的实体。
  4. 修改cocos2D代码以允许sprite具有多个Z值 在不同的点。如果精灵可以有多个Z值 精灵的特定部分落在哪个瓦片上然后计算 该部分的Z值很容易。我不需要比较 精灵到任何其他精灵。我相信这可以通过使用 每个精灵的多个四边形。问题在于它 对我来说有点复杂,因为我是OpenGL ES和cocos2D的新手。一世 不完全了解所有内部数据结构如何 工作。虽然它似乎是最优雅的解决方案,如果一个公式 无法找到。
  5. 我将对有用资源的任何建议或参考进行投票。

1 个答案:

答案 0 :(得分:1)

对于#2,您可以计算对象中心的曼哈顿距离,并将此值用作该对象的z值。只要您避免地图中的非常长的对象(如5x1对象或更糟),它就会起作用。但是如果你真的需要将一个长对象放置在平铺地图中,那么通过使用公式设置z值来管理地图中对象的z顺序是不可能的。

证明这一点:
1.)将两个2x2对象水平放置在地图中,并在它们之间留下单位图块。
2.)在它们之间放置一个3x1对象。让我们将2x2对象命名为A和B,将3x1对象命名为C.
3.)如果你只是旋转C(不改变它的位置),则A和B的z顺序互换。

- 如果B现在在前面,B后面的一些物体将位于A的前方,因为C的旋转。并且知道A和B后面的哪些物体之前将成为A的前面是很昂贵的。在C轮换之后。