我有一个GameScene,敌人和玩家精灵在z:0添加。我在z:-1处向GameScene添加了一个背景图层,这适用于主背景。唯一的问题是我想展示一些云,为此他们应该在z:1尊重玩家和敌人的精灵。
我的方法是在背景图层的z:2处添加云,但这还不够好,因为它们仍然出现在敌人和玩家精灵之下。
我原以为z值(2)会被添加到背景层z值(-1),导致绝对(与GameScene父层相比)z值为z:1,因此高于z:0的敌人和玩家精灵。
显然我错了。
然后我观察到,当我向一个图层添加一个精灵时,如果在同一个图层中,最后添加的精灵将显示在之前的精灵之上(例如,在玩家精灵之后添加敌人会在玩家顶部显示敌人精灵)。我想这是一个避免奇怪的图形效果(混合颜色的两个图像的叠加)的惯例。 这是正确的吗?
现在,我唯一的解决方案是拥有多个背景图层(一个用于云,一个用于实际背景地形),并将它们添加到GameScene的不同z级别。这是正确的吗?这样做的缺点是我必须维护逻辑相似的类。
答案 0 :(得分:2)
以下是来自即将发布的sample chapter about how draw order works的cocos2d中的Cocos2D Essential Reference(关于此问题,请关注我的博客)。
以下是绘制订单的工作原理的简短摘要:
最重要的是,zOrder只影响同一级别的子节点。如果场景中有两个子节点A和B,并且首先绘制A,则A的所有子节点也将绘制在节点B下面。
答案 1 :(得分:1)
在绘制元素时按顺序绘制,等于zOrder属性,我的意思是,带有zOrder -3的项目将在具有zOrder -2的项目之前绘制,带有zOrder 1的项目将在具有zOrder 0的项目之后绘制,依此类推。所有zOrder都在一个节点内工作,因为所有节点的内容都是用它的draw
方法绘制的。检查CCNode的visit
方法,您可以在代码中看到它。
因此,您可以创建不同的图层,以便能够将具有不同“深度”重新关联的游戏对象添加到场景中。例如,背景图层,障碍图层,敌人和英雄图层,奖励图层等。
答案 2 :(得分:1)
Morion清楚地回答了您对zPosition
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的精灵在上面,有时精神来自第2层)。