添加到SKSpriteNode时,SKShapeNode不呈现

时间:2018-01-19 15:51:46

标签: sprite-kit

我有一个非常奇怪的情况,即从多边形创建的SKShapeNode在添加到SKSpriteNode时没有显示,但在基础SKScene上工作正常。 (更新 - 已解决,请参阅问题结尾

作为调试的一部分,我将另一个SKSpriteNode附加到SKShapeNode,以在顶部显示另一个图像。

第二张图片总是出现。

所以工作层次结构是:

  • SKScene
    • SKShapeNode - 蓝色形状
      • SKSpriteNode - Ant图片

第一张照片上出现了空白 - Ant在两者中位于同一位置。

SKShapeNode on the SKScene

非工作层级是:

  • SKScene
    • SKSpriteNode - 脚图
      • SKShapeNode - 蓝色形状(未绘制但附加的Ant
        • SKSpriteNode - Ant图片

Image with SKSHapeNode as root - no drawing

希望足够的代码可以帮助某人了解正在发生的事情。请注意:

  1. 使用点数组构造绘图不是副作用 - 如果我使用init(rect:)init(rectOf:)
  2. 创建简单的矩形形状,则会发生同样的情况
  3. 它发生在设备和模拟器上。
  4. 扩展到调试后更新,如评论中所示

    场景背景设置为红色以使其清晰。

    Scaled scene x 2 to show relative positions

    感谢您的任何建议,我在这里结束了。

    将绘图和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)
    

    enter image description here

    这似乎与the docs

    直接矛盾

    如果多个节点共享相同的z位置,则对这些节点进行排序,以便在子节点之前绘制父节点,并按照它们在父节点子节点中出现的顺序呈现兄弟节点。

    让我得出这样的结论:形状节点的默认zPosition是不同的,或者由于某些其他原因,此机制不适用于此处! (也许是因为节点类型的变化?)

1 个答案:

答案 0 :(得分:0)

我决定发布自己的答案,因为它是两部分的。

正如this answer中所述,核心问题是SKView极其命名的 ignoresSiblingOrder属性。

忽略兄弟顺序 - 它也是忽略父子订单。

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

因此,您可以将ignoresSiblingOrder设置为false,或者即使在添加子节点时也可以显式设置zPosition

假设如果他们的订单看起来适合父母,那么人们可能会认为事情正在发挥作用。我怀疑混合节点类型会导致该理论中明显的随机失败。

我使用ignoresSiblingOrder=false进行了进一步测试,以确认这是我的一个因素。