【问题标题】:SKShapeNode not rendering when added to SKSpriteNodeSKShapeNode 添加到 SKSpriteNode 时不呈现
【发布时间】:2018-06-28 21:58:12
【问题描述】:

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

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

第二张图片总是出现。

所以工作层次结构是:

  • SKScene
    • SKShapeNode - 蓝色形状
      • SKSpriteNode - 蚂蚁图片

在第一张图片上裁剪了空白 - Ant 在两张图片中的位置相同。

非工作层次结构是:

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

希望这里有足够的代码来帮助人们弄清楚发生了什么。请注意:

  1. 这不是使用点数组构造绘图的副作用 - 如果我使用init(rect:)init(rectOf:) 创建一个简单的矩形形状,也会发生同样的事情
  2. 它发生在设备和模拟器上。

按照 cmets 中的建议,在缩放到调试后更新

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

感谢您的任何建议,我在这里束手无策。

将绘图和蚂蚁图片附加到节点的代码

  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 不同,或者由于其他原因,此机制不适用于此处! (可能是因为节点类型的变化?)

【问题讨论】:

  • 你的applyTo在哪里被调用?
  • 我现在的猜测是您的形状确实存在,但是这些点与 SKSpriteNode 无关,而是相对于场景而言是绝对的,这将其扔掉了。为了验证我的理论,在您的 SKS 文件中,将宽度和高度添加 10 的倍数。随着缩放模式的启动,这将使所有东西缩小 10 倍,但你应该在远处的某个地方看到你的蓝色脚。
  • 感谢@Knight0fDragon 给了我一个线索!将场景缩放 10 后,如果我将脚节点定位在 0,0,它会出现(很小)在屏幕的左下角,没有蓝色覆盖的迹象。如果我让足部锚点为默认值 0.5,0.5 并将其定位在巨型场景的计算中间,则会出现蓝色叠加层——在足部图片的上方和右侧,部分在足部图片的后面。我正在玩一些缩放的东西,看看我能不能把它拉得更近。
  • 等你看到它在脚后?那么你也有 zposition 的问题,你需要担心
  • 我对明显落后的绘图感到非常困惑 - 我认为 zPosition 仅适用于 SIBLINGS。已在调试器中确认正在调用 addChild(draw) 的节点是带有脚图片的精灵。这里没有兄弟姐妹 - 所有嵌套的孩子

标签: sprite-kit


【解决方案1】:

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

正如this answer 中所指出的,核心问题是SKView名称非常糟糕 ignoresSiblingOrder 属性。

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

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

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

假设人们可能会认为如果他们的订单似乎对父子正常工作,那么他们会认为事情正在发挥作用。我怀疑混合节点类型会在这个理论中导致明显的随机故障。

我对@9​​87654326@ 进行了进一步测试,以确认这对我来说是一个因素。

【讨论】:

  • 我同意,真的应该叫ignoresRenderingOrder
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多