重新启动并在GameScene中展示

时间:2015-09-28 00:07:47

标签: ios iphone swift segue touchesbegan

你好我的问题是,当我点击一个按钮重新启动我的游戏时它会重启,但是如果我点击一个转换到MainMenuViewController的按钮,那么场景将会冻结。有趣的是,如果我重新启动游戏并首先点击segue按钮它将正常工作,但如果我点击重启按钮,游戏将会冻结。当点击segue按钮并且它崩溃时,我得到的错误没有带有标识符'GameToMain'的segue,当它确实第一次工作时。当我点击重启游戏时,它会崩溃而没有错误。以下是此问题的相关代码:

class GameViewController: UIViewController {
    override func viewDidLoad() {
    super.viewDidLoad()
    let skView = view as! SKView
    let scene = GameScene(size: skView.bounds.size)
    skView.showsFPS = true
    skView.showsNodeCount = true
    skView.ignoresSiblingOrder = false
    //skView.showsPhysics = true
    scene.scaleMode = .AspectFill
    skView.presentScene(scene)        
    scene.viewController = self
}
}

class GameScene: SKScene, SKPhysicsContactDelegate {
var viewController: GameViewController!

这是在玩家输掉时调用的func中设置的:

    let tryAgain = SKLabelNode(fontNamed: "Chalkduster")
    tryAgain.text = "Try Again?"
    tryAgain.color = SKColor.yellowColor()
    tryAgain.name = "retryLabel"
    tryAgain.fontSize = 28
    tryAgain.position = CGPoint(x: size.width/2, y: size.height/2)
    playerLayerNode.addChild(tryAgain)

    let mainMenuTransition = SKLabelNode(fontNamed: "Chalkduster")
    mainMenuTransition.text = "Main Menu"
    mainMenuTransition.color = SKColor.yellowColor()
    mainMenuTransition.name = "mainMenuTransitionSeque"
    mainMenuTransition.fontSize = 20
    mainMenuTransition.position = CGPoint(x: size.width/2, y: size.height/2 - 60)
    playerLayerNode.addChild(mainMenuTransition)

这是标签注册和响应被轻敲的方式

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch in (touches ) {
let location = touch.locationInNode(self)
     let node = self.nodeAtPoint(location)
            if (node.name == "retryLabel") {
                print("restart")
                let gameScene = GameScene(size: self.size)
                let transition = SKTransition.doorsCloseHorizontalWithDuration(0.5)
                gameScene.scaleMode = SKSceneScaleMode.AspectFill
                gameScene.viewController = GameViewController()
                self.scene!.view?.presentScene(gameScene, transition: transition)
                print("complete Reload")
            }

            if (node.name == "mainMenuTransitionSeque") {
                print("go to main menu")
                self.viewController!.performSegueWithIdentifier("GameToMain", sender: self)
                print("complete2")

}

1 个答案:

答案 0 :(得分:0)

我用当前代码解决了问题:

class GameViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    let skView = view as! SKView
    let scene = GameScene(size: skView.bounds.size)

    //skView.showsFPS = true
    //skView.showsNodeCount = true
    skView.ignoresSiblingOrder = false
    //skView.showsPhysics = true
    scene.scaleMode = .AspectFill
    scene.viewController = self
    skView.presentScene(scene)        

}

}

在GameScene中

var viewController: GameViewController!
  override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            let location = touch.locationInNode(self)
            let node = self.nodeAtPoint(location)
            if (node.name == "retryLabel") {

                let skView = view as SKView!
                let scene = GameScene(size: skView.bounds.size)
                skView.ignoresSiblingOrder = false
                scene.scaleMode = .AspectFill
                scene.viewController = viewController.self
                skView.presentScene(scene)
            }

            if (node.name == "mainMenuTransitionSeque") {
                self.viewController.dismissViewControllerAnimated(false, completion: nil)
                print("complete2")
            }

        }

    }
}

所以基本上重新启动场景我将GameViewController中的代码复制并粘贴到GameScene中,以便它可以完全重启场景,但关键是重新声明viewController变量。然后,为了到达mainMenu,我解除了视图控制器(GameScene)而不是创建一个新的segue,这样我就不会继续添加越来越多的场景。