2016-06-04 21 views
0

Ich versuche, ein Asteroiden Spiel zu machen, und jedes Mal, wenn der Asteroid mit dem Spieler kollidiert die Endszene fein, geschnitten, wenn ich versuche, es neu zu starten wie der Code steckt die Kollisionsfunktion, die aufgerufen die Endszene. Hier ist die KollisionsfunktionSwift SpriteKit presentScene Fehler

func didBeginContact(contact: SKPhysicsContact) { 
    print("5") 
    //Creating a variable that holds which two items collide 
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 
    //Creating a switch case statement 
    //This will run a different case depending on whitch two objects collide 
    switch(contactMask) { 
    //If the satellite and the asteroid collide do this 
    case bitMask.satellite.rawValue | bitMask.asteroid.rawValue: 
     //removing the satellite 
     let secondNode = contact.bodyB.node 
     secondNode?.physicsBody?.allowsRotation = true 
     let firstNode = contact.bodyA.node 
     firstNode?.removeFromParent() 
     //Stopping the mission timer 
     removeActionForKey("missionDurationTime") 
     self.removeAllChildren() 
     print("6") 
     self.view?.presentScene(EndScene()) 
     print("7") 
    default: 
     return 
    } 
} 

Und hier ist die Funktion, die von meinem Ende Szene zu meiner Spielszene geht zurück

func Restart(){ 
    print("hello") 
    RestartBtn.removeFromSuperview() 
    speach.removeFromSuperview() 
    score.removeFromSuperview() 
    gameOver.removeFromSuperview() 
    self.view?.presentScene(GameScene()) 

} 

Nachdem ich die Restart-Taste traf alle Etikett in der EndScene geht weg wie sie sollten, aber dann ist der Bildschirm leer und die Konsole druckt nur 5 Zu viele Male zu zählen, bis die Etiketten in der Endszene zurückkommen. Ich bin sehr verwirrt und weit über meinem Kopf. Jede Hilfe wird sehr geschätzt!

UPDATE:

ich den Code in meiner Neustart-Taste, um diesen Nun sollte die Spielszene Lasten und alles ist wie es

print("hello") 
    RestartBtn.removeFromSuperview() 
    speach.removeFromSuperview() 
    score.removeFromSuperview() 
    gameOver.removeFromSuperview() 
    let scene = GameScene(size: self.view!.bounds.size) 
    scene.backgroundColor = SKColor(red: 1, green: 1, blue: 1, alpha: 1) 
    scene.scaleMode = .AspectFill 
    scene.backgroundColor = UIColor.whiteColor() 
    let transition = SKTransition.pushWithDirection(SKTransitionDirection.Left, duration:0.5) 
    self.scene?.view?.presentScene(scene, transition: transition) 

geändert werden, mit Ausnahme der Tatsache, dass alles fünfmal größer . Dies ist, wie es aussehen soll: What it should look like

Und das ist, wie es What it does look like

+0

Wie werden Sie rufen Ihre erste Szene, wenn die App startet (Code in gameView Controller) ?. Können Sie diesen Code bitte in Ihre Frage einfügen? In Ihrem aktuellen Neustart-Code ist es wichtig, dass Sie das GameScene mit den View-Grenzen als dessen Größe initialisieren. Die darunter liegenden Zeilen für den Skalenmodus Zeile 2 funktionieren nicht, wenn Sie Ihre Szene nicht mehr skalieren. Ich nehme an, dass Sie Ihre Szene anders skalieren, wenn Sie Ihr Spiel laden und wenn Sie es neu starten und es daher anders aussieht. – crashoverride777

+0

Ich verwende nur den Code im Game View Controller, den Xcode Ihnen gibt, wenn das Sinn macht. Ich kann den genauen Code gerade nicht posten, da ich gerade nicht bei meinem Mac bin. –

+0

Ich habe eine Antwort hinzugefügt. Lass mich wissen wie es geht. – crashoverride777

Antwort

0

schaut In Ihrem Code neu starten Sie den GameScene mit einer Größe von view.bounds werden initialisiert.

Wenn Sie Ihren GameViewController-Code nicht standardmäßig geändert haben, verwenden Sie die GameScene.sks-Datei als Referenz (Visual-Level-Editor) mit einer Standard-Szenengröße von 1024 * 768 und Skaliermodus .AspectFill.

Kurz im Restart-Funktion versuchen, diese

if let scene = GameScene(fileNamed: "GameScene") { // fileNamed is the GameScene.sks file 
    scene.backgroundColor = SKColor(red: 1, green: 1, blue: 1, alpha: 1) 
     .... 


} 

oder alternativ

let scene = GameScene(size: CGSize(width: 1024, height: 768) 
scene.backgroundColor .... 
+0

Funktioniert das auf allen Bildschirmgrößen? Kann es jetzt nicht gerade versuchen, nur im Voraus denken –

+0

Yeah mit aspectFill ist die beste Lösung für die meisten Fälle, es hängt davon ab, was Sie machen. Im Allgemeinen ist die Idee, dass Sie Ihre Sachen in Ihrem Spiel zur Mitte hin positionieren und nur etwas mehr Platz auf den Seiten/oben/unten haben, wenn Sie auf einem iPad laufen (in Ihrem Fall nur etwas mehr Platz Hintergrund). Schauen Sie sich dies http://blog.infinitecortex.com/2014/01/spritekit-understanding-skscene-scalemode/ – crashoverride777

+0

Es wollte, dass ich Kommas nach jedem Szene.Thing und dann sagte Variable in seinem eigenen Anfangswert verwendet –

Verwandte Themen