Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift SKSpriteNode隐藏在父节点下面_Swift_Sprite Kit - Fatal编程技术网

Swift SKSpriteNode隐藏在父节点下面

Swift SKSpriteNode隐藏在父节点下面,swift,sprite-kit,Swift,Sprite Kit,使用Swift和SpriteKit时,我遇到了一个问题,当作为一个孩子添加到另一个SKSpriteNode时,SKSpriteNode没有显示。相反,放在完全相同位置的SKLabelNode会出现 // does not show up, expected a white square override func renderBody(parentNode: SKNode, position: CGPoint) { let node = SKSpriteNode(color: UICol

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

“位置”是一个点(x:50,y:50)

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

// 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)
}
有人知道什么是错误的吗

编辑:手动设置zPosition可解决此问题。然而,我仍然认为有些地方出了问题。您不需要在子节点上手动设置它,以避免其父节点隐藏子节点。我从来没有在Xcode 5中这样做过。为什么labelnode和sprite节点之间有区别

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

您要查找的是
SKView
上的属性:

一个布尔值,指示父-子和同级 关系会影响场景中节点的渲染顺序

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


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

zPosition属性控制节点的绘制顺序。具有最高值的节点将位于顶部。默认值为0。感谢您的回答!是的,将zPosition设置为某个正值确实解决了问题。但我对这个解决方案不太满意。请参阅我编辑的问题中的解释。我认为添加zPosition=0的子级应该自动将其置于其父级之上。