Sprite-Kit: 精灵层次顺序

14

如何在Sprite-Kit中更改精灵的z顺序?

Cocos2d代码:

[parentNode addChild:sprite1 z:3];
[parentNode addChild:sprite2 z:2];
[parentNode addChild:sprite3 z:1];

我在Sprite-Kit中尝试了以下代码,但它并没有改变z-order。

[parentNode insertChild:sprite1 atIndex:3];
[parentNode insertChild:sprite2 atIndex:2];
5个回答

30
要改变绘制顺序,请使用节点的 zPosition 属性:

zPosition:节点相对于其父节点的高度。

默认值为0.0。正 z 轴向观察者投影,因此具有较大 z 值的节点更靠近观察者。呈现节点树时,会计算每个节点(在绝对坐标中)的高度,然后按照从最小 z 值到最大 z 值的顺序呈现树中的所有节点。如果多个节点共享相同的 z 位置,则对这些节点进行排序,以便在渲染它们的父节点之前绘制它们的子节点,并按它们在父节点的子节点数组中出现的顺序渲染兄弟节点。命中测试是按相反的顺序处理。

SKView 类的 ignoresSiblingOrder 属性控制是否为具有相同 z 位置的节点启用节点排序。

也可以使用 insertChild:atIndex: 来影响 z 顺序,但请注意索引是数组中对象的索引,而不是其 zPosition(即 atIndex 参数与 cocos2d 中的 z 参数不同,事实上相反)。添加到较低索引的节点将在绘制时先于较高索引的节点绘制。

还要注意,不能在超出范围的索引处插入节点。根据 NSMutableArray 文档:

[...] 不能将对象插入到大于数组当前计数的索引处。例如,如果数组包含两个对象,则索引 0 和 1 是有效索引。索引 2 无效。

对象数组的大小为2,因此可以在索引0、1或2处添加对象。索引3是非法的并且超出了边界;如果您尝试在数组大小为2时在索引3处添加对象,则NSMutableArray会引发异常。

1
@LearnCocos2D 我已启用了 ignoresSiblingOrder,但是具有相同 zPosition 的精灵仍按照我将它们添加到其父级的顺序进行渲染。这样做是否不可靠?如果我需要一些精灵在 ignoresSiblingOrder 设置为 true 的情况下绘制在其他精灵的前面,我感觉我必须显式设置正确的 zPosition,但到目前为止我还没有这样做。 - Ben Kane

4
在Swift中,你可以这样做:
sprite.zPosition = 1

通常zOrder只是一个示例,比如:

-1(放到后面)

0(在中间,也是默认值)

1(放在所有元素的前面)

当你的所有对象具有相同的zPosition(例如默认值0.0)并且它们被添加到同一个父节点中时,它们出现的顺序由代码中的"addChild"顺序确定:最后一个在所有元素的最上层。


1

我总是只使用:

sprite.zPosition = 13;  

如果我希望将其放在zPosition 13上。zPosition越高,精灵离用户越近,它将会被渲染并显示在具有较小zPosition的精灵之前。

1

来自苹果Sprite Kit文档的图片 例如,在这里考虑一个天空节点和一个直升机节点,它们都有4个子节点:导弹、主体、旋翼1和旋翼2。我们希望旋翼1和旋翼2在主体上方,导弹在主体下方。

second image

给天空的.zPosition = 0,这将使天空具有默认的zPosition。 给身体.zPosition = 100,它将在天空上方,身体将在天空上方可见。并且子节点rotor1、rotor2和missile。给Rotor 1和Rotor 2的z位置z= +1,这使得它们位于身体的上方,并给导弹的zPosition z= -1,这使得它们位于身体下方。

0

正如其他人所说,使用节点的zPosition属性。但是如果您不想跟踪场景中所有节点的各种zPositions,您可以将Sprite放置在相对于另一个深度的位置,例如:

newSprite.zPosition = anotherSprite.zPosition + 1

将newSprite放在anotherSprite的前面。我还为那些必须始终位于场景中最前面或最后面的精灵保存了100和-100。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接