I am encountering an issue with the zPosition of nodes on my SpriteKit scene.
I am building a manager node that enables "layer like" management of nodes zPosition, essentially enabling you to get rid of the manual management of the zPosition property and instead to add nodes with methods like addNodeUnder(node:SKNode)
and also to create groups.
Here is a test scene I have made :
The problem is that with the operations I have made, the green and the yellow node should be on top of the red node.
I made my own little debugger, displaying the SceneKit "scene graph" in hierarchical order :
Node of type LMManagerNode has zPosition = 0.0 and has children :
Node of type LMWarpperNode has zPosition = 0.0 and has children :
Node of type SKSpriteNode ('Red node') has zPosition = 0.0.
Node of type LMWarpperNode has zPosition = -100.0 and has children :
Node of type SKSpriteNode ('Blue node') has zPosition = 0.0.
Node of type LMWarpperNode has zPosition = 100.0 and has children :
Node of type LMGroupNode ('Test group') has zPosition = 0.0 and has children :
Node of type LMWarpperNode has zPosition = -150.0 and has children :
Node of type SKSpriteNode ('Yellow node') has zPosition = 0.0.
Node of type LMWarpperNode has zPosition = -200.0 and has children :
Node of type SKSpriteNode ('Green node') has zPosition = 0.0.
As you can see :
- The red node is contained inside a node that has
zPosition = 0
- The blue node is contained inside a node that has
zPosition = -100
- The yellow and green nodes are contained inside a group node, itself contained inside a node that has
zPosition = 100
Since the node that contains the red node has zPosition = 0
and the node that contains the green and yellow nodes has zPosition = 100
, shouldn't these two nodes be on top of the red node ?
The ignoresSiblingOrder
of my SKView
is set to false
by the way...
EDIT : That's weird : yellowNode.zPosition = 1000 does make the yellow node go on top of the red node. How can it be possible ?
EDIT #2 Here is the code of my debugging function :
func renderNodeHieararchyForNode(node:SKNode, index:Int) {
var i = 0
var beginning = ""
while i != index {
beginning += " "
i++
if i == index {
beginning += " "
}
}
print("\(beginning)Node of type \(node.dynamicType) \(node.name != nil ? "('\(node.name!)')" : "") has zPosition = \(node.zPosition)\(node.children.count > 0 ? " and has children :" : ".")")
for (i,child) in node.children.enumerate() {
renderNodeHieararchyForNode(child, index: index+1)
if i == node.children.count-1 {
print("")
}
}
}
func renderNodeHiearchyForNode(node:SKNode) {
renderNodeHieararchyForNode(node, index: 0)
}
As you can see, I use only the SpriteKit framework methods to display it, so the output of my debugger is definitely correct.
yellowNode.zPosition = 1000
does make the yellow node go on top of the red node. How can it be possible ? – Trevör