2014-10-03 53 views
5

使用Swift和SpriteKit时,SKSpriteNode在将其作为子项添加到另一个SKSpriteNode时没有显示出问题。相比之下,放在完全相同位置的SKLabelNode显示出来。SKSpriteNode隐藏在父节点下面

// does not show up, expected a white square 
override func renderBody(parentNode: SKNode, position: CGPoint) { 
    let node = SKSpriteNode(color: UIColor.whiteColor(), size: CGSize(width: 48, height: 48)) 
    node.position = position 
    parentNode.addChild(node) 
} 

// does show up as white text in the correct position 
override func renderBody(parentNode: SKNode, position: CGPoint) { 
    let node = SKLabelNode(text: "hello") 
    node.position = position 
    parentNode.addChild(node) 
} 

'parentNode'和'position'在两种情况下都是相同的。

'parentNode'是一个较大的SKSpriteNode,用深色的纹理创建,覆盖屏幕作为背景。

'position'是CGPoint(x:50,y:50)。

它看起来像矩形精灵获取低于背景,而标签精灵顶部。我尝试删除背景并将矩形精灵直接添加到场景节点,然后显示出来。

有没有人有什么可能是错的想法?

编辑:设置zPosition手动解决问题。不过,我仍然认为在某个地方出了问题。您不需要在子节点上手动设置它,以避免其父节点隐藏子节点。我从来不需要在Xcode 5中执行此操作。为什么labelnode和sprite节点之间存在差异?

下面是一个希望更好地说明它的例子。在Xcode 6中创建一个默认的SpriteKit,Swift,Iphone项目。将下面的代码粘贴到touchesBegan的for-loop中。删除在didMoveToView中创建的“Hello World”标签。运行它并单击屏幕中间的某个位置。

let location = touch.locationInNode(self) 

// LabelNode without manually setting zposition 
// visible 
let backGround1 = SKSpriteNode(imageNamed:"Spaceship") 
backGround1.position = CGPoint(x: location.x, y: location.y + 250) 
backGround1.xScale = 0.5 
backGround1.yScale = 0.5 
self.addChild(backGround1) 
let labelNode = SKLabelNode(fontNamed: "ChalkDuster") 
labelNode.text = "I am on top" 
labelNode.fontSize = 48 
labelNode.fontColor = UIColor.yellowColor() 
backGround1.addChild(labelNode) 

// SpriteNode without manually setting zposition 
// hidden under its parent node 
let backGround2 = SKSpriteNode(imageNamed:"Spaceship") 
backGround2.position = location 
backGround2.xScale = 0.5 
backGround2.yScale = 0.5 
self.addChild(backGround2) 
let spriteNode2 = SKSpriteNode(color: UIColor.yellowColor(), size: CGSize(width: 100, height: 100)) 
backGround2.addChild(spriteNode2) 

// SpriteNode with zposition manually set 
// visible 
let backGround3 = SKSpriteNode(imageNamed:"Spaceship") 
backGround3.position = CGPoint(x: location.x, y: location.y - 250) 
backGround3.xScale = 0.5 
backGround3.yScale = 0.5 
self.addChild(backGround3) 
let spriteNode3 = SKSpriteNode(color: UIColor.yellowColor(), size: CGSize(width: 100, height: 100)) 
spriteNode3.zPosition = 0.001 
backGround3.addChild(spriteNode3) 
+2

zPosition属性控制绘制节点的顺序。具有最高值的节点将位于顶部。默认值为0. – 0x141E 2014-10-03 05:43:19

+0

感谢您的回答!是的,将zPosition设置为正值可以解决问题。但我对这个解决方案并不满意。请参阅我编辑问题的解释。我认为添加一个zPosition = 0的孩子应该自动将它放在父代的顶部。 – uaknight 2014-10-03 17:34:10

回答

9

什么你要找的是ignoresSiblingOrder财产上SKView

一个布尔值,指示父子和兄弟姐妹是否 关系影响场景节点的渲染次序。

默认的Xcode 6.x的(也许5,我没有检查)SpriteKit模板设置,为true建立在视图控制器的SKView时。将它设置为true,将节点添加到场景中的顺序不会影响它们的z位置。如果将其设置为false,则会按照将它们添加到场景(或父节点)的顺序进行分层。

这就是说,当ignoresSiblingOrdertrue(这就是为什么这是模板中的默认值)时,SpritKit可以做一些优化,因此如果可能的话最好保持这种方式。在这种情况下,您必须手动设置每个节点的zPosition属性。