Swift:多个精灵套件游戏场景,从视图控制器加载游戏场景?

时间:2015-08-22 18:53:17

标签: swift sprite-kit

好吧,所以我在Swift中有sprite kit游戏,我在Apple为你设置的GameScene.swift文件中创建了我的游戏,这一切都很有效。现在我想在同一个项目中创建另一个游戏场景。

当游戏结束时,游戏现在移动到我在故事板中设置的新UIViewController(名为GameOverBufferViewController)。但我希望它能够进入一个全新的游戏场景。

所以我查看了GameViewControllerGameScene.swift如何加载(因为游戏场景需要视图控制器以及SKScene代码)并将其复制到我的视图控制器文件中UIViewController,当游戏结束时游戏移动到。

我更改了对GameScene的引用以匹配我的新游戏场景swift文件(GameOverScene1)和unarchiveFromFile func以避免错误:

import UIKit
import SpriteKit

extension SKNode {
    class func unarchiveFromFile2(file : NSString) -> SKNode? {
        if let path = NSBundle.mainBundle().pathForResource(file as String, ofType: "sks") {
            var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)
            var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData!)

            archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
            let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameOverScene1
            archiver.finishDecoding()
            return scene
        } else {
            return nil
        }
    }
}


class GameOverBufferViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        if let scene = GameOverScene1.unarchiveFromFile2("GameOverScene1") as? GameOverScene1 {
            // Configure the view.

            let skView = self.view as! SKView

            skView.showsFPS = true
            skView.showsNodeCount = true
            skView.showsPhysics = false

            /* Sprite Kit applies additional optimizations to improve rendering performance */
            skView.ignoresSiblingOrder = true

            /* Set the scale mode to scale to fit the window */
            scene.scaleMode = .AspectFill

            skView.presentScene(scene)

        }


    }

然后我在这里设置我的GameOverScene1.swift文件:

import SpriteKit

class GameOverScene1: SKScene {

    override func didMoveToView(view: SKView) {

        //Do stuff in scene
        println("it works!")
    }
}

游戏运行没有任何错误或崩溃,但GameOverScene1没有运行;它只是GameOverBufferViewController。控制台上也没有任何内容。

我做错了什么?

EDIT ********

这就是我的GameOverBufferViewController文件现在的样子,我收到SIGABRT错误could not cast a UIView as an SKView

import UIKit
import SpriteKit

class GameOverBufferViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
            // Configure the view.

            back()


    }
    func back() {
        view.subviews.map({ $0.removeFromSuperview() })

        let theView = view as! SKView //error on this line
        let theMainMenu = GameOverScene( size: view.frame.size )
        theMainMenu.scaleMode = SKSceneScaleMode.ResizeFill

        theView.presentScene( theMainMenu )

    } 

3 个答案:

答案 0 :(得分:0)

我只是用这个:

func back() {
    let theView = view as! SKView
    let theMainMenu = MainMenu( size: view.frame.size )
    theMainMenu.scaleMode = SKSceneScaleMode.ResizeFill

    theView.presentScene( theMainMenu )
}

MainMenuSKScene的子类。

编辑:

确保在主UIView的{​​{1}}函数运行时,您将视图声明为ViewController。像这样:

viewDidLoad()

答案 1 :(得分:0)

试试这个:

    let SceneMove = SceneName(size: self.scene!.size)
    SceneMove.scaleMode = SKSceneScaleMode.AspectFill
    self.scene!.view!.presentScene(SceneMove)

SceneName当然是场景的名称。

来自skyguy和他发布的链接:How to transition scenes in Swift

答案 2 :(得分:0)

我认为问题来自你的" unarchiveFromFile"扩展SKNode的功能。

尝试更改此行:

let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameOverScene1 

到此:

let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! SKScene

另请注意,您不需要有很多" unarchiveFromFile"每个新场景(每个新级别)的函数,只需在GameViewController类中导入后定义一个。