如何在 SpriteKit 中溶解节点?

Posted

技术标签:

【中文标题】如何在 SpriteKit 中溶解节点?【英文标题】:How to dissolve nodes in SpriteKit? 【发布时间】:2015-06-16 05:23:11 【问题描述】:

我有 2 个 SKSpriteNode 对象,我想交叉淡化它们。 最简单的方法之一是创建一个fadeOut SKAction 和一个fadeIn SKAction,并将它们应用到SKSpriteNode 对象。但是这种方法的问题是,在动作过程中,它们的alpha都在1.0以下,看起来不太好。

例如,我想将红色方形 SKNode 分解为绿色圆形 SKNode

如果只是在动作期间淡出红色方块并淡入绿色圆形,它会看起来像这样

所以你可以通过这两个对象看到背景。我希望像这样溶解这两个对象:

在 UIKit 中我可以使用UIView.transitionWithView,但在 SpriteKit 中我只找到了一种类似的呈现场景的方法 (SKViewObject.presentScene: transition:)。那么到底有没有为 SKNodes 做一个溶解过渡?

【问题讨论】:

【参考方案1】:

在调整两个节点上的 Alpha 设置时,您几乎无法了解背景。一个可能的技巧可能是在您的背景前面但在其他两个节点后面临时插入一个实体节点,直到操作完成。此时您将其删除。

节点应该是两个节点横截面的形状(请原谅我草率的艺术品):

【讨论】:

感谢您的评论,但由于我需要进行大量纹理溶解,因此很难为所有图案创建横截面。但无论如何,谢谢你的帮助:)【参考方案2】:

我为这个问题搜索了很多,我几乎决定使用着色器来进行这种溶解(因为您可以直接在着色器中编辑像素),但后来我发现有一种不寻常的方法可以解决这个问题.它可能不适用于所有情况,但如果您的背景不做滚动或缩放等操作,这种方法可能是最简单的。简单来说就是为当前屏幕创建一个截图并显示在顶部,然后将你的节点更改为你需要的精灵,最后淡出你截取的截图。

所以首先你必须确保所有节点都在正确的节点树中。然后使用SKViewObject.textureFromNode(rootNode) 创建屏幕截图,从这个纹理中创建一个精灵节点,并将其添加到您的屏幕上。然后,您可以创建淡出 SKAction 以淡出此屏幕截图精灵。您也可以在操作结束时将其移除。

使用这种方法,在淡出期间屏幕将如下所示:

【讨论】:

以上是关于如何在 SpriteKit 中溶解节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift(SpriteKit)中绘制一个作为单个节点的圆点[关闭]

SpriteKit + Swift - 如何通过缓动移动节点?

如何在 SpriteKit 中跟踪接触后的节点移动

如何在 SpriteKit 中创建图像节点?斯威夫特 4

SpriteKit:如何添加/删除节点并避免枚举时出现突变异常?

SpriteKit:如何遍历节点的祖先?