Swift 3(SpriteKit):更改影响所有子节点的父节点的透明度值

7

比如说,我创建了一个SKShapeNode并为其创建了子节点(例如十字架及其两条交叉的线)。十字架是父节点,交叉的线是子节点。你如何更改所有父节点的子节点的alpha值? 目前只使用:

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

我已经拍摄了使用线而不是圆时的问题截图: 谢谢。

哎呀,父子关系肯定有问题。你能展示更多的代码吗?这个应该是可以工作的。 - Confused
我编辑了我的帖子。 - J.Treutlein
1
尝试将nodeParent更改为SKNode()而不是SKShapeNode()。这应该不会有任何区别,但值得一试。 - Confused
啊,所以你正在尝试使用KnightOfDragon的技巧? - Confused
阅读我的评论,针对@Confused的回答 - 我现在会尝试那个。 - J.Treutlein
显示剩余6条评论
1个回答

3
这是SpriteKit blendModes的正确预期行为,主要是因为它们没有像它本身一样忽略任何内容的类似混合模式。当您降低几个节点(在这种情况下是按顺序绘制)的不透明度时,你会在任何混合位置得到一个累积结果,这就是为什么中间有亮部分的原因。
在我对你之前问题的回答中,我通过将十字的两个轴“扁平化”成纹理来避免了累积渲染,然后将该纹理作为SpriteNode加载,这是一个只渲染一次的对象,因为它是一个整体没有交叉点。
如果您想要避免这种不完全不透明度的顺序累积渲染效果,必须首先使用所有对象/线条/形状100%的不透明度将其“展平”,然后应用不透明度更改以获得阿尔法效果。
这就是我在那个第一个“答案”中说的原因,这不是您更大问题的解决方案,只是一种获得所需结果的方法。
如果没有忽略渲染模式,SpriteKit将无法进行重叠而不对任何具有不完全不透明度的内容产生累积影响。

好的,我只是想听听其他人对此的不同意见,看看是否有其他解决方法。似乎没有,所以你是正确的。纹理的问题在于它们很慢,而我每秒都在创建一个新的纹理。 - J.Treutlein
@J.Treutlein,你使用的SKShapeNodes是导致游戏变慢的原因,而不是纹理。SpriteKit可以以高效的方式渲染许多纹理(通过使用图集)。但是对于SKShapeNode来说,情况并非如此。当渲染时,它需要(至少)一个绘制调用。在这里阅读更多信息(https://dev59.com/R43da4cB1Zd3GeqPy11K#31610775)或者(http://stackoverflow.com/a/31699990/3402095)。如果屏幕上有50个以上的SKShapeNodes,则可能会遇到严重的性能问题。正如文档中指出的那样,应该谨慎使用。 - Whirlwind
@J.Treutlein 在这里阅读有关批量渲染的更多信息:https://dev59.com/TX7aa4cB1Zd3GeqPpFtQ(请参阅LearnCocos2D的帖子)。 - Whirlwind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接