2015-04-10 8 views
9

ich eine SKSpriteNode, die ich fade out mit baseNode.runAction(SKAction.fadeOutWithDuration(0.5))SpriteKit: fade out SKNode - Kinder scheint durch

Das Sprite hat ein Kind. Auch ein SKSpriteNode. (Der rote Block im Bild)

Während die baseNode ausgeblendet wird, gibt es die Kontur des Kindknotens.

Was ist der beste Weg, dies zu vermeiden und verblassen den gesamten Knoten mit seinen Kindern gleichzeitig? Ich möchte eine Texturanimation im untergeordneten Knoten wiedergeben. Also flatten ist keine Lösung.

enter image description here

+0

Möchten Sie nur den Kindknoten ausblenden? – sangony

+0

Nein, ich möchte beide Nodes gleichzeitig ausblenden. Es sieht so aus, als würde ich den Elternknoten einfach ausblenden. –

Antwort

1

Sie die gleiche Aktion auf dem auch Kinder-Knoten haben zu rufen.

baseNode.runAction(SKAction.fadeOutWithDuration(0.5)) 

for node in baseNode.children as! [SKSpriteNode] 
{ 
    node.runAction(SKAction.fadeOutWithDuration(0.5)) 
} 
+0

Ich habe das schon probiert. Aber da scheint immer noch das Kind durch. Ich nehme an, es ist, weil das Alpha beider Knoten hinzugefügt wird. Wenn also die Ausblendung bei 0,5 liegt, haben beide zusammen noch 1,0 Alpha. –

+0

Wenn das Kind die gleiche Farbe hat und nicht gesehen werden soll, warum nicht ClearColor verwenden? – ZeMoon

+0

Die Höhe des untergeordneten Elements ist höher als der sichtbare Teil, da über den roten Balken eine Texturanimation abgespielt wird. –

0

Statt fadeOutWIthDuration() auf die untergeordneten Knoten, warum Sie nicht colorizeWithColor (_ verwenden: colorBlendFactor: Dauer :).

https://developer.apple.com/library/prerelease/ios/documentation/SpriteKit/Reference/SKAction_Ref/index.html#//apple_ref/occ/clm/SKAction/colorizeWithColor:colorBlendFactor:duration:

colorizeWithColor (_: colorBlendFactor: Dauer :)

Erstellt eine Animation , dass ein Sprite Farbe belebt und Faktor mischen.

Erklärung

SWIFT

Klasse func colorizeWithColor (_ Farbe: UIColor, colorBlendFactor colorBlendFactor: CGFloat, Dauer sec: NSTimeInterval) -> SKAction

Parameter

Farbe Die neue Farbe für das Sprite.

colorBlendFactor Der neue Mischfaktor für das Sprite.

Sek. Die Dauer der Animation.

Rückgabewert Ein neues Aktionsobjekt.

Diskussion Diese Aktion kann nur von einem SKSpriteNode-Objekt ausgeführt werden. Wenn die Aktion ausgeführt wird, werden die Eigenschaften color und colorBlendFactor des Sprites auf ihre neuen Werte animiert.

Diese Aktion ist nicht reversibel; das Gegenteil dieser Aktion tut nichts.

Import Statement

SWIFT

Import SpriteKit

Vorhanden in iOS

7.0 und höher.

+0

Ich habe diese 'SKAction.colorizeWithColor (SKColor.clearColor(), colorBlendFactor: 1.0, duration: 1) 'aber das Kind scheint immer noch durch. –

4

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.

Non-flattened vs. flattened SKSpriteNode

+0

Wirklich eine großartige Lösung. Aber ich möchte eine Texturanimation mit dem Kindknoten spielen. Aber ich mag deine Antwort sehr, also werde ich es belohnen, wenn es keine andere Lösung gibt. –

0

Sie können einen Elternteil SKEffectNode verwenden, die sowohl den Basisknoten wickelt und den untergeordneten Knoten und tun die Fade auf dem Effekt Knoten selbst.

Auch wenn Sie keine Filter oder andere Features von SKEffectNode verwenden, werden die untergeordneten Elemente in einem privaten Framebuffer gerendert, so dass Sie letztendlich versuchen, was der abgeflachte Vorschlag versucht hat, aber alles wird für Sie erledigt Auch wenn die Kinder jeden Frame animieren, so wie Sie es in Ihrem Beispiel tun.

Für die Leistung können Sie auch die zusätzlichen Kosten für die Verwendung eines übergeordneten SKEffectNode deaktivieren, indem Sie setEnableEffects = false festlegen und diese Option nur ein-/ausschalten, wenn die Fade ausgeführt werden muss.

0

Für Übergänge zwischen Bildschirmen ist ein cooler Effekt, einen schwarzen Knoten zu haben, der den gesamten Bildschirm abdeckt und dann ausblendet. Ich kam mit der folgenden: Swift 3

import SpriteKit 

override func didEnter(from previousState: GKState?) { 

let blackNode = SKSpriteNode(color: SKColor.black, size: scene.size) 
blackNode.position = CGPoint(x: scene.size.width/2, y: scene.size.height/2) 
blackNode.zPosition = Layer.top.rawValue 
scene.worldNode.addChild(blackNode) 
blackNode.alpha = 1.0 
blackNode.run(SKAction.fadeOut(withDuration: 0.5)) } 

ich kämpfen, um die Lösung dieses Problems zu finden, so dass ich hoffe, dass dies hilft jemand da draußen. Prost

Verwandte Themen