9
votes

What effect addChild and zPosition really have on a scene?

I mean this: suppose I do this

sprite1.zPosition = 50;
sprite2.zPosition = 10;
sprite3.zPosition = 30;

and later do this

[self addChild:sprite1];
[self addChild:sprite2];
[self addChild:sprite3];

according to SpriteKit and considering zPosition order, sprite1 should be rendered over sprite3 over sprite2 but spriteKit ignores that and renders 3 over 2 over 1.

am I missing something?

2
no more code. The code is just this. 3 layers with 3 different zPositions but are added in random order. SpriteKit should respect zPosition but it is not.Duck
Try setting zPosition after addChild instead of before.user688518
That should do no difference.Dobroćudni Tapir
Can you make a test project for this case? Or just paste entire code from SKSceneAndrey Gordeev
It would help if you showed more code and then a screen shot of what is happening vs what should be happening.Fogmeister

2 Answers

15
votes

If they have the same parent that would be true. In case they can different parents, the z order of parents is also taken into account.

The standard behavior for scene rendering follows a simple pair of rules:

  1. A parent draws its content before rendering its children.
  2. Children are rendered in the order in which they appear in the child array.

When you take z positions into account, here is how the node tree is rendered:

  1. Each node’s global z position is calculated.
  2. Nodes are drawn in order from smallest z value to largest z value.
  3. If two nodes share the same z value, ancestors are rendered first, and siblings are rendered in child order.

You can find it well explained here under Understanding the Drawing Order for a Node Tree

5
votes

In your game view controller, set the ignoresSiblingOrder property to false (or NO in objective-C).

let skView = self.view as SKView
skView.ignoresSiblingOrder = false