Swift 3(SpriteKit):更改影响所有子项的父级的alpha值

时间:2016-12-22 04:36:31

标签: swift sprite-kit alpha children skshapenode

比如说我创建SKShapeNode并为它创建子项(例如十字架及其两条相交线)。十字是父,十字线是孩子。你怎么能改变所有父母的孩子的阿尔法价值? 目前只使用:

parent.alpha = 0.5

不会改变其子女的alpha值。

如果有人能够创建可以解决此问题或使用任何其他方式的着色器,请回复。 这篇文章是对我之前的帖子的回应:(Swift: Make translucent overlapping lines of the same color not change color when intersecting) 如果有人能够解决这个问题,我试图让半透明线相交的黑点消失。

以下是一些代码示例:

let nodeParent = SKShapeNode()
let nodeOne = SKShapeNode(circleOfRadius: 5)
let nodeTwo = SKShapeNode(circleOfRadius: 5)

//Set the color of the circles, I'm not sure if this is the right way 
nodeOne.fillColor = UIColor.init(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
nodeTwo.fillColor = UIColor.init(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)

nodeParent.addChild(nodeOne)
nodeParent.addChild(nodeTwo)
addChild(nodeParent)

nodeParent.alpha = 0.5

我在使用线条而不是圆圈时截取了问题的屏幕截图:

感谢。

1 个答案:

答案 0 :(得分:3)

对于SpriteKit blendModes来说,这是正确的和预期的行为,主要是因为他们没有类似的混合模式,忽略了与自身相同的任何东西。

当您减少几个节点的不透明度时,仍会按顺序绘制,因为您可以在任何混合位置下获得累积结果。这就是为什么中间明亮的部分。

在我对你上一个问题的回答中,我通过“扁平化”来避免累积渲染。交叉的两个轴进入一个纹理,然后将该纹理加载为SpriteNode,一次性渲染对象没有交叉,因为它只是一件事。

你想要避免这种累积,连续渲染效果低于完全不透明度的任何东西都要求你先“平坦化”#34;它具有100%不透明度的所有对象/线条/形状,首先应用不透明度变化以获得alpha效果。

这就是为什么我说,在第一个答案中,它并不是解决你的更大问题的唯一办法,只是一种获得理想结果的方法。

如果没有类似的忽略渲染模式,SpriteKit就无法进行叠加,而不会对任何不完全不透明度的东西产生累积影响。