Jon*_*ter 11 fadeout sprite-kit skaction swift
我有一个SKSpriteNode,我淡出了 baseNode.runAction(SKAction.fadeOutWithDuration(0.5))
精灵有一个孩子.也是一个SKSpriteNode.(图像中的红色块)
当baseNode淡出时,存在die子节点的轮廓.
什么是避免这种淡出与其子整个节点的最佳方式同时?我想在子节点中播放纹理动画.如此扁平化是没有解决方案的.

这个问题引起了我的好奇心.我有一个解决方案,但是,由于缺乏我对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).

您还必须对节点的子节点调用相同的操作。
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)
| 归档时间: |
|
| 查看次数: |
3261 次 |
| 最近记录: |