2016-06-25 4 views
0

In einigen Tutorials auf einer kostenpflichtigen Webseite habe ich gelernt, dass man das Spiel wiederholen kann, indem man die gleiche Szene noch einmal präsentiert, aber ich bin nicht mehr sicher was ich mache falsch. Wenn ich mich richtig erinnere, verwendet das Tutorial so etwas wie dieses (in GameScene Klasse):Präsentiere die selbe `GameScene` wieder

func newGame() { 
    let newScene = GameScene() 
    let transition = SKTransition.fadeWithColor(SKColor.blackColor(), duration: 0.5) 
     view?.presentScene(newScene, transition: transition) 
    view?.presentScene(newScene, transition: transition) 
} 

GameViewController.swift:

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    if let skView = self.view as? SKView { 
     if skView.scene == nil { //if the scene hasn't been created yet 
      let aspectRatio = skView.bounds.size.height/skView.bounds.size.width 
      let scene = GameScene(size: CGSize(width: 320, height: 320 * aspectRatio)) 

      //skView.showsFPS = true 
      //skView.showsNodeCount = true 
      //skView.showsPhysics = true 
      skView.ignoresSiblingOrder = true 

      scene.scaleMode = .AspectFill 
      skView.presentScene(scene) 
     } 
    } 
} 

Das Problem ist, das gibt mir die folgende Fehlermeldung:

libc++abi.dylib: terminating with uncaught exception of type NSException 

Wenn ich einige Haltepunkte hinzufüge, scheint das Problem mit meinem GameScene zu sein. Das ist ersten paar Zeilen davon:

class GameScene: SKScene, SKPhysicsContactDelegate { 
    var player: Player! 
    var world: SKNode! 

Die erste und die zweite Linie verursacht einen schwerwiegenden Fehler (glaube ich), aber ich bin nicht sicher, warum. Soll ich alle Kinder aus der Szene entfernen, bevor ich dieselbe Szene noch einmal vorstelle? Mit diesem Tutorial haben wir nur die gleiche Szene in ein paar Zeilen dargestellt und es hat funktioniert.

UPDATE:

class GameScene: SKScene, SKPhysicsContactDelegate { 
    var player: Player! 
    var world: SKNode! 

    override func didMoveToView(view: SKView) { 
     self.physicsWorld.contactDelegate = self 
     player = Player(position: CGPointMake(size.width*0.5, size.height*0.4)) 
     world.addChild(player) 
    } 
} 

Da die GameScene Klasse ist ziemlich lang, ich habe gerade den Teil hinzugefügt, die ich denke, problematisch ist, aber nicht wissen, warum oder was soll ich ändern. diese

+0

Es sieht aus wie die 'GameScene' Klasse wird unter der Annahme, dass 'player' und' world' werden ausgefüllt. Kannst du die komplette 'GameScene'-Klasse zeigen? –

+0

Ich habe einen Teil davon hinzugefügt, ich hoffe es ist genug, weil die ganze Klasse lang ist. Wenn es nicht genug ist, kann ich zusätzliche Methoden hinzufügen, aber ich denke, dass dieser Teil am relevantesten ist. – Larisa

+0

Neue GameScene bei jedem neuen Spiel scheint widersprüchlich mit "die gleiche Szene wieder präsentieren". Beim Erstellen einer zweiten Instanz von GameScene kann etwas an der Logik falsch sein? Schwer zu sagen, ohne mehr Code. Versuchen Sie, ein "dummes" GameScene aufzubauen und testen Sie, ob das Problem in GameScene liegt ... –

Antwort

0

Wechsel:

func newGame() { 
    let newScene = GameScene() 
    let transition = SKTransition.fadeWithColor(SKColor.blackColor(), duration: 0.5) 
     view?.presentScene(newScene, transition: transition) 
    view?.presentScene(newScene, transition: transition) 
} 

Um dies:

func newGame() { 
    let newScene = GameScene(size: CGSize(width: 768, height: 1024)) 
    let transition = SKTransition.fadeWithColor(SKColor.blackColor(), duration: 0.5) 
     view?.presentScene(newScene, transition: transition) 
    view?.presentScene(newScene, transition: transition) 
} 

Auch in Bezug auf Ihre gameViewController, brauchen Sie nicht die Größe des skView mit dem Seitenverhältnis zu machen. Da Sie AspectFill als ScaleMode verwenden, wird die Szene automatisch skaliert. Damit würden Sie dann die Bildschirmgröße 768x1024 (Hochformat) oder 1024x768 (Querformat) einstellen. Um dies kompatibel mit allen Geräten einfach den Hintergrund 1024x1024 machen, so dass es auf dem iPad gut aussieht und Sie können HUD-Elemente für iPad anpassen nur durch so etwas wie dies zu tun:

if UIDevice.currentDevice().userInterfaceIdiom == .Pad { 
    yourButton.position.y += 100 
    yourLabel.position.y += 100 
    etc 
}