2016-10-14 10 views
2

Ich habe ein einfaches 2D-Arcade-Spiel mit SpriteKit erstellt und versuche ein Scoring-System hinzuzufügen. Das Spiel ist ein quadratisches Sprite, das über verschiedene Hindernisse springen muss. Also was ich will ist, wenn der Spieler das Objekt für das ganze Spiel kontaktiert, um neu zu starten. Das Spiel erkennt den Kontakt (ich habe es vorher getestet), aber wenn ich alle meine Kinder entferne und dann die grundlegende Hauptfunktion meines Spiels ausführe, merke ich, dass alte Objekte immer wieder zusammenkommen und sich gegenseitig überfluten.Sprite neu starten - Kit Game Swift

func didBegin(_ contact: SKPhysicsContact) { 

    if (contact.bodyA.categoryBitMask == PhysicsCategory.Player && contact.bodyB.categoryBitMask == PhysicsCategory.Obstacles) { //case where PLAYER collides with OBSTACLE 

     print("I detect Contact") 

     Scorelabel.text = "0" 
     scoreCounter = 0 


     self.removeAllActions() 
     self.removeAllChildren() 

     self.setupGame() 

    } 

// die didBeging func für andere Fälle wird dann

`

+1

Es tut mir leid, aber ich verstehe Ihre Frage nicht: Es ist nicht klar, ob Sie ein einfaches Spiel über oder den Verlust eines Lebens (wo Sie zum Beispiel zurückkehren sollten, ohne die volle neu zu laden Szene). Wie auch immer, wenn du ein Spiel über dir haben willst, solltest du der Antwort von Nik folgen, ansonsten solltest du deine Eigenschaften korrigieren, um einen alten Zustand darzustellen. Sie sollten nicht in didBegin (_contact) tun, weil es oft aufgerufen werden könnte (Ihr Code ist falsch ..) –

+0

Okay vielen Dank. Ich glaube, was du gesagt hast, dass es mehrmals aufgerufen wurde, ist falsch. –

Antwort

5

Wenn Sie versuchen, eine Szene neu zu starten, können Sie präsentieren nur die gleiche Szene und setzt sich wieder auf die Standardeinstellung:

let scene = GameScene(size: self.size) // Whichever scene you want to restart (and are in) 
let animation = SKTransition.crossFade(withDuration: 0.5) // ...Add transition if you like 
self.view?.presentScene(scene, transition: animation) 

Setzen Sie diesen Code in welcher auch immer Szene, die Sie in sind und neu starten möchten. Es sollte aufgerufen werden, wenn Sie die Szene neu starten möchten.

Sie möchten vielleicht nur keine Animation anzeigen lassen (oder eine Überblendung durchführen), wenn Sie versuchen, einen nahtlosen Übergang zu erstellen.

Alternativ können Sie ein Spiel über Szene/Menü erstellen. Dies könnte nur ein weiterer SKNode sein, der sichtbar wird, sobald das Spiel zurückgesetzt wird oder sogar eine andere Szene.

+1

So empfehle ich das Zurücksetzen, es ermöglicht Ihnen, ein neues Spiel neu zu starten, was bedeutet, dass keine vorherigen Spieldaten in das neue Spiel übernommen werden konnten und den Status – Knight0fDragon

+0

korrumpieren Wher Setzen Sie diesen Code, um die Szene neu zu starten? – Confused

+0

@Confused Wo immer Sie die Szene neu starten möchten – Nik

2

Zu allererst fortgesetzt, sollten Sie beide Fälle überprüfen, wenn Spieler Kontakt A ist oder wenn Spieler ist Kontakt B. Zweitens sollten Sie das Objekt zuweisen, das Sie entfernen möchten, sagt das Hindernis, zu einer Variablen, zum Beispiel sagt, dass Objekt das Hindernis ist, dann: contact.bodyB.node.removeFromParent() und Sie werden das Objekt erfolgreich entfernen .

+1

Ich glaube, ich war nicht sehr klar. Mein Ziel ist es, mein Spiel komplett neu zu starten. Ich möchte nicht nur das gegebene Hindernis sondern alles entfernen. Was den anderen Kontaktfall angeht, habe ich ihn in meinen Code implementiert, aber ich habe ihn einfach nicht als Teil meiner Frage hinzugefügt, also sah er passender aus. –

+1

In diesem Fall kannst du es so auf deiner Spielszene machen: lass newGame = GameScene (Größe: self.size) newGame.viewController = self.viewController self.viewController.currentGame = newgame self.changePlayer() = newGame.currentPlayer self.currentPlayer lassen Übergang = SKTransition.doorway (withDuration: 1,5) self.view? .presentScene (newGame, Übergang: Übergang) –