2016-06-26 4 views
-1

Ich habe in diesem Teil stecken geblieben, ich habe versucht, FromParent zu entfernen, aber es funktioniert nicht. In meinem Spiel, wenn ein Gegner dreimal mit dem Spieler kollidiert, ist das Problem, dass die Gegner für einige Sekunden weiterkommen und dann verschwinden, aber dem Spieler weiterhin Schaden zufügen.Wie entferne ich ein Sprite, wenn das Spiel vorbei ist?

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

Sie geben uns nicht wirklich viel zu arbeiten. Woher kommt die obige Funktion? Das logische Ding wäre, etwas wie eine 'gameOver'-Variable zu haben (das ist vielleicht Ihre gameStarted var?). Wenn das wahr ist, dann kehren Sie einfach von der didBeginContact-Funktion zurück, ohne irgendwelche Überprüfungen irgendeiner Logik durchzuführen. –

+0

Ich habe den ded Start Kontaktcode zu meiner Frage hinzugefügt –

Antwort

0

OK, also muss ich nicht allzu viel Informationen über Ihr Spiel durch zu gehen, aber wenn Sie den Player nicht die Feinde wollen halten beschädigen die quick and dirty fix wäre ein hinzufügen Wache an die Spitze Ihrer didBeginContact Funktion:

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) 
    } 
} 

das zumindest etwas verhindern soll aufgerufen Kontakte basierend zu erhalten, nachdem die erforderliche Anzahl der Treffer aufgetreten ist. Was das Säubern der Sprites betrifft, klingt das ziemlich einfach (removeFromParent zur passenden Zeit), aber ich habe keine Ahnung, wie du mit deinen Spielzuständen umgehst, daher ist es schwer, weiter zu kommentieren.

persönlich auslösen würde ich es aus der update() Funktion, wenn der erforderliche Zustand passiert ...

+0

Ich habe Benjamin hinzugefügt Danke, aber jetzt die Feinde macht keinen Schaden –

+0

Wenn Sie Ihren bestehenden Code hinzufügen, wo es heißt, sollte dies identisch zu dem, was Sie bis zu dem Punkt haben, wenn Ihre Hits Variable hat 3 erreicht. Nach diesem Punkt werden die Feinde keinen Schaden mehr machen (wie beabsichtigt, dachte ich?) –

+0

OK, ich habe die Bits hinzugefügt, von denen ich dachte, dass Sie sie aus Gründen der Klarheit hinzufügen könnten. –