首页 文章

SKSpriteNode隐藏在父节点下面

提问于
浏览
6

使用Swift和SpriteKit,我有一个问题,SKSpriteNode在作为子项添加到另一个SKSpriteNode时没有显示 . 相比之下,放置在完全相同位置的SKLabelNode会显示出来 .

// 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中创建一个默认的SpriteKit,Swift,Iphone项目6.将下面的代码粘贴到touchesBegan中的for循环中 . 删除在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)

1 回答

  • 10

    你要找的是 SKView 上的ignoresSiblingOrder属性:

    一个布尔值,指示父子关系和兄弟关系是否影响场景中节点的呈现顺序 .

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

    话虽这么说,当 ignoresSiblingOrdertrue 时,SpritKit可以做一些优化(这就是为什么's the default in the template), so it'可能最好保持这种方式,如果可能的话 . 在这种情况下,你必须手动设置每个节点的 zPosition 属性 .

相关问题