SpriteKit:淡出SKNode - 孩子们闪耀着光芒

Jon*_*ter 11 fadeout sprite-kit skaction swift

我有一个SKSpriteNode,我淡出了 baseNode.runAction(SKAction.fadeOutWithDuration(0.5))

精灵有一个孩子.也是一个SKSpriteNode.(图像中的红色块)

baseNode淡出时,存在die子节点的轮廓.

什么是避免这种淡出与其子整个节点的最佳方式同时?我想在子节点中播放纹理动画.如此扁平化是没有解决方案的.

在此输入图像描述

Clo*_*ddy 6

这个问题引起了我的好奇心.我有一个解决方案,但是,由于缺乏我对Swift的了解,我已经用Objective-C编写了它.但是,它非常简单,移植应该没问题.

诀窍是将整个节点展平为单个纹理并将其淡化.

我使用类别实现了这一点.下面的代码texture用平面纹理替换SKSpriteNode 的属性.关键方法是-textureFromNode:SKView类中.

@interface SKSpriteNode (Fading)

- (void)flattenForFading;

@end
Run Code Online (Sandbox Code Playgroud)

...

#import "SKSpriteNode+Fading.h"

@implementation SKSpriteNode (Fading)

- (void)flattenForFading {
  SKTexture *flattenedContents = [self.scene.view textureFromNode:self];

  /// Copy the children array, so when we are iterating the removing doesn't cause any problems
  NSArray *children = [self.children copy];

  for (SKNode *child in children) {
    [child removeFromParent];
  }

  self.texture = flattenedContents;
  self.size = self.texture.size;
}

@end
Run Code Online (Sandbox Code Playgroud)

对于非SKSpriteNode情况,您只需添加一个新的SKSpriteNode作为被展平的节点的子节点.由于您正在烘焙单个纹理,因此不支持节点内的动画.当然,你也可以隐藏它们,而不是删除所有的孩子.如果要为删除的纹理添加额外属性,甚至可以保存内部状态并使用方法恢复此方法的效果-unflatten.但这超出了你的问题的范围.

我在模拟器中截取了这个截图.请注意,节点计数器对应于3个褪色SKSpriteNodes,1个SKLabelNode和1个扁平子画面(SKSpriteNode).

非扁平与扁平SKSpriteNode


ZeM*_*oon 1

您还必须对节点的子节点调用相同的操作。

baseNode.runAction(SKAction.fadeOutWithDuration(0.5))

for node in baseNode.children as! [SKSpriteNode]
{
    node.runAction(SKAction.fadeOutWithDuration(0.5))
}
Run Code Online (Sandbox Code Playgroud)