0

我想用 cocos2D 制作等距、基于瓷砖的 iPhone 游戏。

精灵需要绘制在它“后面”的其他精灵之上。我正在寻找最好的方法来做到这一点。

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

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

这些是我想到的选项:

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

我将对任何有用的资源的建议或参考进行投票。

4

1 回答 1

1

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

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

-如果B现在在前面,由于C的旋转,B后面的一些物体会在A前面。而且要知道之前A和B后面的哪些物体在C旋转后会在A前面是很昂贵的.

于 2012-12-07T11:42:13.750 回答