适用于基于区块链的cocos2D iPhone游戏的最佳Z排序方法



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

精灵需要绘制在其他"后面"的精灵之上。我正在寻找最好的方法。

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

GPU和cocos2D支持Z缓冲区算法,所以这是我想使用的,但存在问题。一些精灵,比如建筑物,占据了多个瓷砖。为这样的精灵指定Z值是困难的。

这些是我想到的选项:

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

我会对任何有用资源的建议或引用投赞成票。

对于#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前面,成本很高。

最新更新