SKSpriteNode 隐藏在父节点下方

2023-12-23

使用 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,使用深色纹理创建,覆盖屏幕作为背景。

“位置”是 CGPoint(x: 50, y: 50)。

看起来矩形精灵位于背景下方,而标签精灵位于顶部。我尝试删除背景并将矩形精灵直接添加到场景节点,然后它确实出现了。

有人知道可能出什么问题吗?

编辑:手动设置 zPosition 可以解决问题。不过,我还是觉得有什么地方不对劲。您不需要在子节点上手动设置它,以避免其父节点隐藏子节点。我从来没有在 Xcode 5 中这样做过。为什么 labelnode 和 sprite 节点之间有区别?

这是一个例子,希望能更好地说明这一点。在 Xcode 6 中创建默认的 SpriteKit、Swift、Iphone 项目。将以下代码粘贴到 TouchBegan 中的 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)

您正在寻找的是ignoresSiblingOrder https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKView/#//apple_ref/occ/instp/SKView/ignoresSiblingOrder属性于SKView:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SKSpriteNode 隐藏在父节点下方 的相关文章

随机推荐