2017-06-13 3 views
3

The run function pour SKNode vous permet d'exécuter un bloc lorsque l'action est terminée, mais si l'action est annulée/retirée par removeAllActions?SpriteKit: exécuter du code ou bloquer lorsque l'action est supprimée?

Annulation d'une action n'appelle pas le bloc d'achèvement de la fonction run.

Existe-t-il un rappel ou un moyen d'exécuter du code lorsque l'action est annulée/supprimée?

+0

Non que je peux penser sans .run personnalisé et la fonction .remove – Fluidity

+0

Pourquoi voudriez-vous appeler le code lorsqu'une action est supprimée? Par choix de conception, vous allez probablement vouloir que l'objet qui effectue la suppression appelle l'action de suppression, sinon vous risquez de devoir supprimer une action sans exécuter de code, mais vous y serez contraint. – Knight0fDragon

+0

@ Knight0fDragon pour réinitialiser les nœuds dont les propriétés ont été modifiées par des actions. Il serait plus propre que le bloc d'achèvement soit appelé lorsque l'action est annulée et terminée (similaire à 'animateWithDuration' dans' UIView') – Crashalot

Répondre

1

Oui, si vous supprimez une action avant qu'elle ne soit terminée, le bloc d'achèvement ne sera pas exécuté. Par Docs:

La course (: méthode achèvement :) est identique à la course ( :) méthode, mais après l'action terminée, votre bloc est appelé. Ce rappel n'est appelé que si l'action est terminée. Si l'action est supprimée avant la fin, le gestionnaire d'achèvement n'est jamais appelé.

+0

Désolé, question mal formulée. :) Oui, comme indiqué dans la question, il est entendu que le bloc d'achèvement ne fonctionne pas. La question, qui n'était pas claire avant (désolé!), Est comment pouvez-vous exécuter du code ou un bloc lorsque l'action est annulée/supprimée? – Crashalot

+0

Oh, d'accord, j'ai compris. Donc, dans ce cas, vous voudrez peut-être regarder les actions nommées. Avec des actions nommées, vous pouvez ensuite utiliser 'action (forKey:)' comme vérification avant votre 'removeAllActions' pour voir si une action spécifique est en cours. Si c'est le cas, vous pouvez exécuter n'importe quelle action avant d'appeler 'removeAllActions' – rmp

1

Un travail pourrait être autour de:

class YourSpriteNode: SKNode { 

    func doSometingAtCompletionAction() { 
      //all your stuff 
    } 

    override removeAllActions() { 
     super.removeAllActions() 
     doSometingAtCompletionAction() 
    } 
}