0

我在我的 sks 文件中添加了几个节点,现在我想向最低节点添加一些掩码SKSpriteNode。结构如下图:

在此处输入图像描述

在哪里

  • 绿色 - wordInfoHolder
  • 红色 - 标签容器
  • whiteText - 标签

现在我想隐藏以红色显示的部分。为了执行这样的操作,我读到了SKCropNode可以使用的。

我能够在场景文件中找到我的所有节点并将它们保存到变量中。

if let holder = childNode(withName: "wordInfoHolder") as? SKSpriteNode {
        wordInfoHolder = holder
        if let wordSwitchNode = wordInfoHolder?.childNode(withName:"wordSwitchNode") as? SKSpriteNode {
            self.wordSwitchNode = wordSwitchNode

            if let label = self.wordSwitchNode?.childNode(withName:"infoLabel") as? SKLabelNode {
                wordSwitchLabelNode = label
            }
       }
}

所有 3 个对象均已存储且正确。

现在我想为根对象添加一些掩码。

为此,我准备了蒙版图像:

在此处输入图像描述

并尝试执行以下操作:

  guard let holder = wordInfoHolder else { return }
  let positionToSet = holder.position
  let mask = SKSpriteNode(imageNamed: "rectangle_mask")
  let cropNode = SKCropNode()
  holder.removeFromParent()
  cropNode.addChild(holder)
  cropNode.maskNode = mask
  cropNode.position = positionToSet
  self.addChild(cropNode)

但我什么也没看到。我希望看到绿色部分SKSpriteNode

做错了什么?

4

1 回答 1

1

假设您已在所有对象上设置 zPosition。

我很确定问题在于,因为您将持有者对象从场景移动到cropNode,它会保留场景中的位置信息(例如,如果它在场景中的位置是 500、500,那么它在cropNode 中的位置是现在500、500)

我能够重新创建您的问题,并且通过将 holder.position 设置为零,问题就消失了。

在下图中,我使用黄色框作为遮罩,蓝色和粉色框是测试对象,以确保cropNode 放置在它们之间。

在此处输入图像描述

if let holder = self.childNode(withName: "holder") as? SKSpriteNode {
    self.holder = holder

    if let switcher = holder.childNode(withName: "//switcher") as? SKSpriteNode {
        self.switcher = switcher
    }
}

if let mask = self.childNode(withName: "mask") as? SKSpriteNode {

    mask.removeFromParent()

    let positionToSet = holder.position
    holder.position = CGPoint.zero
    mask.position = CGPoint.zero

    let cropNode = SKCropNode()
    holder.removeFromParent()
    cropNode.addChild(holder)
    cropNode.maskNode = mask
    cropNode.position = positionToSet
    cropNode.zPosition = 10
    self.addChild(cropNode)
}

添加花絮

holder.move(toParent: cropNode)

可以用来代替

holder.removeFromParent()
cropNode.addChild(holder)
于 2018-01-31T23:45:28.670 回答