A SKSpriteNode
ist Kind eines SKNode
und wird für Speicherzwecke in einem Array von SKSpriteNode
abgelegt.
Diese SKSpriteNode
wird mit einer Animation gelöscht. Am Ende dieser Animation wird ein Completion-Block ausgeführt, um einige Anweisungen auszuführen ...
Das Löschen muss sowohl in den übergeordneten Elementen SKSpriteNode
als auch im Array erfolgen. Abhängig von der Reihenfolge dieser 2 Löschungen ist das Ergebnis korrekt oder nicht:
SKSpriteNode
aus 1 / dem Array gelöscht wird, dann 2 / aus den SKNode
Eltern, wird der Completion Block ausgeführt. SKNode
Eltern ist dann 2 / das Array, wird der Completion-Block nicht ausgeführt. Warum dieses Verhalten?
%Vor%Die Abschlussmeldung wird angezeigt.
Wenn nun removeFromParent
vor der Aktion 'remove from theGrid
' platziert wird, wird die Vervollständigung nicht wie folgt ausgeführt:
Aus der SKAction Referenz :
Ein SKAction-Objekt ist eine Aktion, die von einem Knoten im. ausgeführt wird scene (SKScene) ... Wenn die Szene ihre Knoten verarbeitet, werden Aktionen mit diesen verknüpft Knoten werden ausgewertet.
Mit anderen Worten, die Aktionen für einen Knoten werden genau dann ausgeführt, wenn dieser Knoten in der Szene ist. Indem Sie removeFromParent
aufrufen, entfernen Sie den Knoten aus der Szene, die Aktion runBlock
wird nie aufgerufen (da der Knoten nicht mehr in der Szene ist), und somit ist die Sequenz niemals beendet. Da die Sequenz nicht abgeschlossen wird, wird der Completion-Block nicht aufgerufen.
Ich würde vorschlagen, den Aufruf removeFromParent
aus Sicherheitsgründen in den Completion-Block zu verschieben. So etwas fühlt sich sicherer an:
TL; DR
Die Sequenz wird nicht abgeschlossen, daher wird der Completion-Block für die Sequenz nicht aufgerufen.
Tags und Links swift sprite-kit