2

我有一个 GameScene,在 z:0 处添加了敌人和玩家精灵。我在 z:-1 向 GameScene 添加了一个背景层,这对于主背景效果很好。唯一的事情是我想展示一些云,为此他们应该在 z:1 尊重玩家和敌人的精灵。

我的方法是在背景层的 z:2 处添加云,但这还不够好,因为它们仍然出现在敌人和玩家精灵的下方。

我会认为 z 值 (2) 将被添加到背景层 z 值 (-1) 导致 z:1 的绝对 (与 GameScene 父层相比) z 值,因此高于 z:0敌人和玩家精灵。

显然我错了。

然后我观察到,当我将精灵添加到图层时,如果在同一图层中,最后添加的精灵将显示在之前的精灵之上(例如,在玩家精灵之后添加敌人将在玩家精灵之上显示敌人)。我想这是避免奇怪的图形效果(两个图像混合颜色的叠加)的惯例。这个对吗?

现在,我唯一的解决方案是拥有多个背景层(一个用于云层,一个用于实际背景地形),并将它们添加到 GameScene 的不同 z 水平。这是正确的吗?这样做的缺点是我必须维护逻辑上相似的类。

4

3 回答 3

2

这是即将发布的Cocos2D Essential Reference中关于绘制顺序如何在 cocos2d 中工作的示例章节(有关此内容的更多信息,请关注我的博客)。

以下是绘制顺序如何工作的简短摘要:

  • 其中节点具有相同的父节点:节点从最低到最高 zOrder 绘制
  • 其中节点具有相同的父节点和相同的 zOrder:节点按照添加为子节点的顺序绘制
  • 不同父节点的绘制顺序与其父节点的绘制顺序相同

最重要的是,zOrder 只影响同级别的子节点。如果您的场景中有两个子节点 A 和 B,并且首先绘制 A,则 A 的所有子节点也会绘制在节点 B 下方。

于 2012-09-11T14:37:35.010 回答
1

zPositionMorion 清楚地回答了您对s的疑问CCNode。但是,我还想为您的第二个问题添加答案。

有两个背景层GameScene是正确的,特别是如果云和地形不交互或共享相同的代码。恕我直言,这实际上在代码分离和模块化方面会更好。

但是,如果您想将它们归为一类(由于某种原因),那么您所要做的就是调用:

// Don't call this in the init, since the parent is obviously nil there...
[[self parent] addChild:cloud z:kBackgroundLayerCloudsZ tag:kBackgroundLayerCloudsTag];

请注意,我们只调用父级来添加子级,并且我们有预定义的常量来帮助我们维护图层。如果您在稍后阶段想要添加一个中间背景层,请更改常量并为新层添加一个新的。

我经常使用这种方法,但是TBH,我认为在您的情况下,两个类会更好。我使用这种方法的情况是当我必须将精灵分成层(为了更好的可维护性、代码分离等),同时来自不同层的精灵是交错的(有时来自 layer1 的精灵是上面,有时来自 layer2 的精灵在上面)。

于 2012-09-11T09:12:26.297 回答
1

在绘制元素时按顺序绘制,等于 zOrder 属性,我的意思是,zOrder -3 的项目将在 zOrder -2 的项目之前绘制,zOrder 1 的项目将在 zOrder 0 的项目之后绘制,依此类推。所有 zOrder 都在一个节点内工作,因为所有节点的内容都在它的draw方法中绘制。检查 CCNode 的visit方法,您可以在代码中看到它。

因此,您可以创建不同的图层,以便能够将具有不同“深度”的游戏对象添加到您的场景中。例如背景层、障碍层、敌人和英雄层、奖励层等。

于 2012-09-11T08:59:31.317 回答