Diese Frage hob meine Neugier. Ich habe eine Lösung, aber aus Mangel an meiner Kenntnis von Swift habe ich es in Objective-C geschrieben. Es ist jedoch sehr einfach und Portieren sollte kein Problem für Sie sein.
Der Trick ist flatten den gesamten Knoten in eine einzige Textur und verblassen stattdessen.
Ich habe dies mit einer Kategorie implementiert. Der folgende Code ersetzt die Eigenschaft eines SKSpriteNode durch eine abgeflachte Textur. Die Schlüsselmethode ist -textureFromNode: innerhalb der SKView
Klasse.
@interface SKSpriteNode (Fading)
- (void)flattenForFading;
@end
...
#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
Im Falle eines Nicht-SKSpriteNode Fall, dass Sie einen neuen SKSpriteNode nur hinzufügen können, als ein Kind des Knotens abgeflacht ist. Animation innerhalb des Knotens wird nicht unterstützt, da Sie eine einzelne Textur backen. Anstatt alle Kinder zu entfernen, könntest du natürlich auch verstecken. Wenn Sie eine zusätzliche Eigenschaft für die entfernte Textur hinzufügen würden, könnten Sie sogar den internen Status speichern und den Effekt dieser Methode mit einer -unflatten
-Methode rückgängig machen. Aber das geht über den Rahmen Ihrer Frage hinaus.
Ich habe diesen Screenshot im Simulator gemacht. Beachten Sie, dass der Knotenzähler den 3 verblassten SKSpriteNodes, 1 SKLabelNode und 1 abgeflachten Sprite (SKSpriteNode) entspricht.

Möchten Sie nur den Kindknoten ausblenden? – sangony
Nein, ich möchte beide Nodes gleichzeitig ausblenden. Es sieht so aus, als würde ich den Elternknoten einfach ausblenden. –