2016-06-26 11 views
-1

私はこの部分で立ち往生していますが、私はremoveFromParentを試みていますが、それは動作しません。私のゲームでは、敵が3回プレイしたときに敵が3秒間コロイドしてしまうと、敵が数秒間続けて消えてしまい、プレーヤーにダメージを与え続けてしまうという問題があります。ゲーム終了時にスプライトを削除するには?

func didBeginContact(contact: SKPhysicsContact) { 
    let body1 = contact.bodyA.node as! SKSpriteNode 
    let body2 = contact.bodyB.node as! SKSpriteNode 

    if ((body1.name == "circuloPrincipal") && (body2.name == "enemigo")) { 

     colisionPrincipal(body2) 



    }else { 

     ((body1.name == "enemigo") && (body2.name == "circuloPrincipal")) 

     colisionPrincipal(body1) 


    } 


} 




func colisionPrincipal(enemigo: SKSpriteNode) { 


     if hits < 2 && circuloPrincipal.color != enemigo.color{ 

     shakeFrame(scene!) 

      circuloPrincipal.runAction(SKAction.scaleBy(1.5, duration:0.5)) 

      enemigo.removeFromParent() 

      let particula = SKEmitterNode(fileNamed: "particulas.sks") 

      particula?.position = enemigo.position 
      particula?.hidden = false 

      particula?.runAction(SKAction.fadeOutWithDuration(0.8)) 


      self.addChild(particula!) 

      hits += 1 


     }else if circuloPrincipal.color == enemigo.color { 

      enemigo.physicsBody?.affectedByGravity = false 

      enemigo.physicsBody?.dynamic = true 

      enemigo.removeFromParent() 

     score += 1 

      scoreLabel.text = "\(score)" 


     }else { 

      shakeFrame(scene!) 

      gameStarted = false 

      enemigo.removeFromParent() 
      enemigoTimer.invalidate() 

      highscoreLabel.runAction(SKAction.fadeInWithDuration(0.5)) 


      if score > highscore { 

       let highscoreDefault = NSUserDefaults.standardUserDefaults() 

       highscore = score 

       highscoreDefault.setInteger(highscore, forKey: "highscore") 

       highscoreLabel.text = "Best: \(highscore)" 

      } 

    } 

} 
+0

あなたは本当に上で動作するために私たちに多くを与えていません。上記の関数はどこから呼び出されていますか?論理的なことは、 'gameOver'変数(おそらくあなたのgameStarted var?)のようなものを持つことでしょう。そして、これが真であるときは、ロジックを実行することをチェックすることなくdidBeginContact関数から戻ります。 –

+0

私の質問に連絡先コードを追加しました –

答えて

0

OKは、私はで行くためにあなたのゲームについてのすべてのその多くの情報を持っていないが、あなたがプレイヤーにダメージを与え続けるために敵をしたくない場合は、拙速な修正が追加することですあなたのdidBeginContact機能のトップにガード:

func didBeginContact(contact: SKPhysicsContact) { 
    guard hits < 3 else { 
     return 
    } 
    let body1 = contact.bodyA.node as! SKSpriteNode 
    let body2 = contact.bodyB.node as! SKSpriteNode 

    if ((body1.name == "circuloPrincipal") && (body2.name == "enemigo")) { 
     colisionPrincipal(body2) 
    }else { 
     ((body1.name == "enemigo") && (body2.name == "circuloPrincipal")) 
     colisionPrincipal(body1) 
    } 
} 

これは、少なくともヒットの必要数が発生した後の接触に基づいて呼び出されるために何かを防ぐ必要があります。スプライトのクリーンアップに関しては、これはかなり簡単です(適切な時点でremoveFromParent)が、あなたのゲーム状態をどのように扱うかについての手がかりがないので、それ以上コメントするのは難しいです。

必要な状態が発生した場合には個人的に私はupdate()機能から、それをトリガーと思います...

+0

私はBenjamin Thanks btwを追加しましたが、今は敵がNyダメージを与えません –

+0

あなたのヒットした時点までのものと同じように動作するはずの既存のコードを追加すると変数は3に達しました。この点の後、敵は何のダメージも与えません(意図したように、私は思いつきましたか?) –

+0

OK、私はあなたが分かりやすくするために追加したビットを追加しました。 –

関連する問題