当我在层次结构中添加额外的 SKNode 子级时,SKCropNode 失败

Posted

技术标签:

【中文标题】当我在层次结构中添加额外的 SKNode 子级时,SKCropNode 失败【英文标题】:SKCropNode fails when I add extra SKNode children in hierarchy 【发布时间】:2016-09-04 18:17:51 【问题描述】:

更新:iOS 10 似乎已修复此问题。我升级到 Swift 3 和 Xcode 8,一切正常。


我已经多次遇到这个问题,但我不知道这是 SKCropNode 中的错误还是我只是在滥用它。也许我缺少一些文档来解释为什么会发生这种情况?


我有一个 100x100 矩形形状的裁剪节点作为蒙版。如果我在其中放置一个蓝色圆圈,它会被正确裁剪。

// Create a crope node with a small square.
let cropNode = SKCropNode()
let cropNodeMask = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 100, height: 100))
cropNodeMask.fillColor = UIColor.whiteColor()
cropNode.maskNode = cropNodeMask
self.addChild(cropNode)

// Create a blue circle and put it in the crop node.
let blueCircle = SKShapeNode(circleOfRadius: 110)
blueCircle.fillColor = UIColor.blueColor()
blueCircle.strokeColor = UIColor.clearColor()
cropNode.addChild(blueCircle)


现在,当我将同一个圆圈放在一个空的 SKNode 内并将该容器放在同一个裁剪节点内时,裁剪失败。

// Create a crope node with a small square.
let cropNode = SKCropNode()
let cropNodeMask = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 100, height: 100))
cropNodeMask.fillColor = UIColor.whiteColor()
cropNode.maskNode = cropNodeMask
self.addChild(cropNode)

// Create a container to hold the circle.
let container = SKNode()
cropNode.addChild(container)

// Create a blue circle and put it in the container.
let blueCircle = SKShapeNode(circleOfRadius: 110)
blueCircle.fillColor = UIColor.blueColor()
blueCircle.strokeColor = UIColor.clearColor()
container.addChild(blueCircle)


但是同一个容器中的精灵似乎被裁剪得很好。

// Create a crope node with a small square.
let cropNode = SKCropNode()
let cropNodeMask = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 100, height: 100))
cropNodeMask.fillColor = UIColor.whiteColor()
cropNode.maskNode = cropNodeMask
self.addChild(cropNode)

// Create a container to hold the sprite.
let container = SKNode()
cropNode.addChild(container)

// Create a spaceship and add it to the container.
let spaceshipNode = SKSpriteNode(imageNamed: "Spaceship")
spaceshipNode.anchorPoint = CGPointZero
container.addChild(spaceshipNode)

【问题讨论】:

试试SKShapeNode以外的东西,用SKLabelNode,我可以告诉你SKShapeNode有bug,已经被证明了 标签被正确裁剪。所以不是裁剪节点——损坏的是形状节点。 是的,SKShapeNode 有很多 bug,最好只用它来变成纹理 【参考方案1】:

SKShapeNode 有问题,最好不惜一切代价避免它。使用它来创建您的形状,然后将其转换为纹理以与 SKSpriteNode 一起使用

【讨论】:

哦哦。说得太早了。我从我的项目中删除了所有 SKShapeNodes 以支持精灵,我的内容仍在逃避作物。我怀疑这是我嵌套裁剪节点的时候,虽然我还没有把它归结为一个简单的复制。 您的答案似乎部分正确。 SKCropNode 和 SKShapeNode 交互不佳,但在这种情况下,这绝对是 SKCropNode 的错,因为它似乎也因子 SKCropNodes 而失败。 this answer 上的类似结论。 SKCropNodes 内的 SKCropNodes 产生不同的结果,alpha 透明裁剪(不再只是一个开关问题,现在如果你的 alpha 为 25%,它会在裁剪时考虑到这一点。与混合函数) 我在我的蒙版中使用了完全不透明或完全透明的像素。混合应该没关系。 无论你是否使用,数学和函数仍然适用

以上是关于当我在层次结构中添加额外的 SKNode 子级时,SKCropNode 失败的主要内容,如果未能解决你的问题,请参考以下文章

具有类数组的 SKNode 子级

当 UITableViewController 是 UITabBarController 的子级时,滚动不起作用

尝试从父级 IOS swift 3 中删除子级时,我的代表为零

Hibernate @OneToMany 在更新父级时从列表中删除子级

React Native 0.6 - 导航到子级时替换标题

核心数据父子关系