我想用cocos2d制作等距,瓷砖,iphone游戏。

精灵需要被绘制在其它精灵的顶部,这些精灵是“后面”。我正在寻找最好的方法。

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

GPU和Cocos2d支持Z缓冲算法,因此这就是我想使用的,但存在问题。一些精灵,例如建筑物,例如,占据多个瓷砖。将z值分配给这种精灵很难。

这些是我想到的选项:

  1. 比较两个建筑物并确定哪一个“在前面”是 简单。所以可以对建筑物进行排序,然后基于的z值分配 排序顺序。这与画家没有任何不同 算法。 OpenGL ES Z缓冲区是不必要的。
  2. 将z值分配给每个基于每个建筑物的位置 地图(没有其他建筑物的知识)。我是 找到这个困难。我认为这是可能的,但我没有 能够提出一个公式。
  3. 使用多精灵占用多个瓷砖的图像,所以 所有精灵都是完全相同的大小。然后可以是z订单 基于Sprite占用的瓷砖易于分配。这 这个解决方案的问题是它使游戏逻辑更多 复杂。一栋建筑物上的所有操作都必须是 对建筑物的每个精灵重复。我想 将每个对象视为一个实体。
  4. 修改Cocos2D代码以允许精灵具有多个Z值 在不同的观点。如果Sprite可以基于的Z值 什么瓷砖的雪碧的特定部分落在,然后计算 该部分的z值很容易。我不需要比较 闪耀到任何其他精灵。我相信这是可以使用的 每个精灵的多个四边形。这是它的问题 因为我是OpenGL ES和Cocos2D的新手,对我来说有点复杂。一世 不要完全了解所有内部数据结构的方式 工作。虽然如果公式似乎是最优雅的解决方案 找不到。

    我会备注到有用资源的任何建议或引用。

有帮助吗?

解决方案

for#2,您可以计算对象中心的曼哈顿距离,并使用此值作为该对象的z值。只要您在地图中避免像5x1对象或更糟糕的地图中避免非常长的对象,它就会起作用。但是如果您真的需要将长对象放在瓷砖地图中,通过使用公式设置z值来管理地图中的对象的z序列是不可能的。
为了证明这一点:
1.)水平地图中的两个2x2对象在地图中放置,并在它们之间留下单位块。
2.)在它们之间放置3x1对象。让我们将2x2对象命名为a和b,以及3x1对象到C.
3.)如果您只需旋转C(不会改变其位置),Z-Order A和B交换。

-if b现在在前面,b后面的一些物体将在a前面前面,因为只有c的旋转。c旋转后。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top