2017-07-11 5 views
1

私のSKノードは一度だけ衝突しますか?衝突するとパーティクルシステムが現れますが、再び衝突すると束が現れます。私はそれを望んでいない。ちょうどそれがそれをthatsしたい。この効果を引き出すにはどうすればいいですか?一度衝突してからもう一度やり直さないでください

if bodyA.categoryBitMask == 1 && bodyB.categoryBitMask == 3 || bodyA.categoryBitMask == 3 && bodyB.categoryBitMask == 1 { 
     print("END GAME") 


     if let dieexplostionNode = SKEmitterNode(fileNamed: "Explosion.sks"){ 
       dieexplostionNode.targetNode = self 
       dieexplostionNode.position = player.position 

       // add 3 actions 
       let wait = SKAction.wait(forDuration: 1.1) 
       let addExplosion = SKAction.run { 
        self.player.addChild(dieexplostionNode) 
        self.player.alpha = 0 
       } 
       let removePlayer = SKAction.run { 
        self.player.removeFromParent() 
        self.player.removeAllActions() 
        dieexplostionNode.removeFromParent() 

       } 

       // put them in a sequence. 
       let seq = SKAction.sequence([addExplosion,wait,removePlayer]) 

       // run the sequence 
       self.run(seq) 

      } 
+0

2つのアイデアが気になります。コリジョンが発生したときにノード(カテゴリまたは物理ボディのカテゴリ/コリジョンビットマップまたはタイプのいずれか)について何かを変更して、再度爆発を実行しないようにするか、別の変数で爆発を引き起こしたかどうかを追跡してください。 –

+0

非常に良いアイデア!ありがとう、本当にありがとう。私はこのようなことを考えようとしていました。カテゴリを変更して、再び衝突するかどうかは関係ありません。ありがとうございました!! –

答えて

2

問題が複数発生する可能性があるため、システムに連絡先を評価して他の評価をしないようにするには、コードにチェックを入れる必要があります。私の好みの方法は、カテゴリビットマスクフラグにビット31を予約し、それが設定されている場合はエバリュエーションしないことです。

guard bodyA.categoryBitMask < 1 << 31 && bodyB.categoryBitMask < 1 << 31 else {return} 

if bodyA.categoryBitMask == 1 && bodyB.categoryBitMask == 3 || bodyA.categoryBitMask == 3 && bodyB.categoryBitMask == 1 { 
     print("END GAME") 
     player.categoryBitMask += 1<<31 

     if let dieexplostionNode = SKEmitterNode(fileNamed: "Explosion.sks"){ 
       dieexplostionNode.targetNode = self 
       dieexplostionNode.position = player.position 

       // add 3 actions 
       let wait = SKAction.wait(forDuration: 1.1) 
       let addExplosion = SKAction.run { 
        self.player.addChild(dieexplostionNode) 
        self.player.alpha = 0 
       } 
       let removePlayer = SKAction.run { 
        self.player.removeFromParent() 
        self.player.removeAllActions() 
        dieexplostionNode.removeFromParent() 

       } 

       // put them in a sequence. 
       let seq = SKAction.sequence([addExplosion,wait,removePlayer]) 

       // run the sequence 
       self.run(seq) 

      } 
関連する問題