我有一个非常奇怪的情况,即从多边形创建的SKShapeNode在添加到SKSpriteNode时没有显示,但在基础SKScene上工作正常。 (更新 - 已解决,请参阅问题结尾)
作为调试的一部分,我将另一个SKSpriteNode附加到SKShapeNode,以在顶部显示另一个图像。
第二张图片总是出现。
所以工作层次结构是:
第一张照片上出现了空白 - Ant在两者中位于同一位置。
非工作层级是:
希望足够的代码可以帮助某人了解正在发生的事情。请注意:
init(rect:)
或init(rectOf:)
扩展到调试后更新,如评论中所示
场景背景设置为红色以使其清晰。
感谢您的任何建议,我在这里结束了。
将绘图和ant pic附加到节点的代码
override func applyTo(node:SKNode) -> Bool {
var pointsVec = renders[0].rescaledPoints().map{ tp in tp.loc }
let numPointsNow = pointsVec.count
if numPointsNow==0 {
return false
}
let draw = SKShapeNode(points: &pointsVec, count: numPointsNow)
draw.lineWidth = 1
draw.fillColor = fillColor
draw.strokeColor = fillColor
draw.position = CGPoint(x: 0, y: 0)
node.addChild(draw)
let antNode = SKSpriteNode(imageNamed: "Ant05_150px.png")
antNode.position = CGPoint(x:0.0, y:0.0) // for anchor 0,0
antNode.size = CGSize(width: node.frame.width, height: node.frame.height)
antNode.anchorPoint = CGPoint(x: 0.0,y: 0.0)
draw.addChild(antNode)
return true
}
工厂功能使SKSpriteNode用于脚
override func makeBackgroundNode(_ within:CGSize) -> SKNode? {
let bgNode = SKSpriteNode(imageNamed: imageName)
bgNode.size = within
bgNode.position = CGPoint(x:0.0, y:0.0) // for anchor 0,0
bgNode.anchorPoint = CGPoint(x: 0.0,y: 0.0)
return bgNode
}
场景工厂使用makeBackground
func makeSKScene(_ within:CGSize) -> SKScene? {
let scene = tgSKSceneWithTouch(size: within)
playingBounds = within
var rootNode : SKNode = scene
if let bg = currentScene?.background {
if let bgNode = bg.makeBackgroundNode(within) {
scene.addChild(bgNode)
rootNode = bgNode
}
...
currentScene?.applyTo(sourceOfTouches:scene, nodeToAttachChildrenTo:rootNode)
// iterates down through non-SpriteKit logic to invoke the applyTo
}
在applyTo
中明确设置zPosition会修复它!
draw.zPosition = node.zPosition + 1
node.addChild(draw)
这似乎与the docs
的直接矛盾如果多个节点共享相同的z位置,则对这些节点进行排序,以便在子节点之前绘制父节点,并按照它们在父节点子节点中出现的顺序呈现兄弟节点。
让我得出这样的结论:形状节点的默认zPosition是不同的,或者由于某些其他原因,此机制不适用于此处! (也许是因为节点类型的变化?)
答案 0 :(得分:0)
我决定发布自己的答案,因为它是两部分的。
正如this answer中所述,核心问题是SKView
的极其命名的 ignoresSiblingOrder属性。
忽略兄弟顺序不 - 它也是忽略父子订单。
一个布尔值,指示父子关系和兄弟关系是否影响场景中节点的呈现顺序。
因此,您可以将ignoresSiblingOrder
设置为false,或者即使在添加子节点时也可以显式设置zPosition
。
假设如果他们的订单看起来适合父母,那么人们可能会认为事情正在发挥作用。我怀疑混合节点类型会导致该理论中明显的随机失败。
我使用ignoresSiblingOrder=false
进行了进一步测试,以确认这是我的一个因素。