2017-08-08 5 views
1

J'ai un tas d'objets (SKNode) en commençant par le haut de l'écran en tombant vers le bas via SKAction.move(to:duration:) et node.run(moveAction). De plus, j'ai un nœud au centre de l'écran avec son propre corps physique qui peut être traîné côte à côte avec l'entrée tactile. Je peux détecter les collisions, mais je me demandais s'il y avait un paradigme pour «mettre en pause» tous les objets alors que le nœud central est en contact avec l'un des objets. De plus, je veux pouvoir déplacer le nœud central pendant que les autres objets sont "en pause" afin que je puisse le déplacer et laisser ensuite les objets reprendre leur mouvement. J'ai pensé que je pourrais probablement itérer à travers tous les objets existants et définir leur propriété isPaused, mais je ne sais pas comment l'application saurait quand le nœud central n'est plus en collision pour que je puisse basculer la propriété en arrière.Comment contrôler la vitesse des nœuds dans SpriteKit

Répondre

2

Pour suspendre les choses, vous devez détecter le contact dans didBegin(), remplir un tableau avec des nœuds qui doivent être mis en pause et enfin mettre en pause les nœuds. La mise en pause réelle peut être effectuée dans didSimulatePhysics() par exemple. Pour mettre en pause tous les nœuds, vous pouvez utiliser

self.enumerateChildNodesWithName("aName") { 
    node, stop in 
    // do something with node or stop 
} 

ou utiliser children propriété d'un noeud et la boucle à travers elle (par exemple. Boucle à travers le récipient de nœuds qui devrait être mis en pause).

Aussi, vous pouvez mettre en pause certaine action avec:

if let action = square.actionForKey("aKey") { 

     action.speed = 0  
} 

et réactivez avec action.speed = 1, ou le rendre slow-mo avec action.speed = 0.5

Pour ralentir la simulation de la physique, il y a une propriété appelée physicsWorld.speed (détermine la vitesse à laquelle la simulation s'exécute).

1

Oh mon garçon, les choses deviennent sûrement compliquées. Tout ce que dit Whirlwind est correct, mais itérer à travers chaque nœud sur la scène peut devenir pénible. Au lieu de cela, je recommande de créer une sous-classe spéciale pour SKNode. Maintenant, cette classe spéciale est nécessaire en raison d'un bug causé par les pommes cadre

class UserPausableNode : SKNode 
{ 
    public var userPaused = false 
    { 
     didSet 
     { 
      super.isPaused = userPaused 
     } 
    } 
    override var isPaused : Bool 
     { 
     get 
     { 
      return userPaused 
     } 
     set 
     { 
      //Yes, do nothing here 
     } 
    } 
} 

La raison pour laquelle nous devons faire est parce que chaque fois isPaused est appelée, elle itère à tous les enfants et définit la propriété de l'enfant isPaused.

Cela devient un problème lorsque la scène s'interrompt et se répète, car cela modifiera l'état de pause des enfants, ce que nous ne voulons pas faire.

Cette classe empêche la modification de la variable isPaused.

Maintenant que cette classe existe, nous voulons l'ajouter à la scène et ajouter tous les nœuds mobiles à ce nouveau nœud.

Puisque tous les nœuds se trouvent sur ce nouveau nœud, tout ce que nous devons faire est de mettre le userPaused à true, ce qui va arrêter tous les nœuds.

Maintenant, assurez-vous que le nœud que vous déplacez ne fait pas partie de cette branche, il devrait être à l'extérieur afin que vous puissiez le déplacer.

Exemple

class GameScene : SKScene 
{ 
    var userBranch = UserPausableNode() 

    func didMove(to view:SKView) 
    { 
     self.addChild(userBranch) 
     //generetedChildren are nodes that you create that you plan on pausing as a group 
     for generatedChild in generatedChildren 
     { 
      userBranch.addChild(node) 
     } 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     //this will pause and unpause based on opposite of previous state 
     userBranch.userPaused = !userBranch.userPaused 
    } 

}