首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:多个精灵套件游戏场景,从视图控制器加载游戏场景?

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

Stack Overflow用户
提问于 2015-08-23 02:53:17
回答 3查看 3.7K关注 0票数 2

好了,我在Swift中有了精灵工具包游戏,我在苹果为你设置的GameScene.swift文件中创建了我的游戏,所有这些都运行得很好。现在我想在这个项目中创建另一个游戏场景。

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

因此,我查看了如何在GameScene.swift中加载GameViewController (因为游戏场景需要一个视图控制器以及SKScene代码),并将其复制到我的UIViewController的视图控制器文件中,游戏结束后将移动到该文件中。

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

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
import SpriteKit

class GameOverScene1: SKScene {

    override func didMoveToView(view: SKView) {

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

游戏运行时没有任何错误或崩溃,但是GameOverScene1没有运行;它只是转到了GameOverBufferViewController。控制台也不会打印任何内容。

我做错了什么?

编辑*

这就是我的GameOverBufferViewController文件现在的样子,我得到了一个SIGABRT错误,显示为could not cast a UIView as an SKView

代码语言:javascript
复制
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 )

    } 
EN

回答 3

Stack Overflow用户

发布于 2015-08-23 03:05:00

我只是使用这个:

代码语言:javascript
复制
func back() {
    let theView = view as! SKView
    let theMainMenu = MainMenu( size: view.frame.size )
    theMainMenu.scaleMode = SKSceneScaleMode.ResizeFill

    theView.presentScene( theMainMenu )
}

MainMenuSKScene的一个子类。

编辑:

确保在主ViewControllerviewDidLoad()函数运行时将视图声明为UIView。如下所示:

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()

    let theView = view as! SKView
    let theWelcome = Welcome( size: view.bounds.size )
    theWelcome.scaleMode = SKSceneScaleMode.ResizeFill

    theView.presentScene( theWelcome )
}
票数 0
EN

Stack Overflow用户

发布于 2015-08-24 13:03:51

试试这个:

代码语言:javascript
复制
    let SceneMove = SceneName(size: self.scene!.size)
    SceneMove.scaleMode = SKSceneScaleMode.AspectFill
    self.scene!.view!.presentScene(SceneMove)

当然,SceneName是场景的名称。

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

票数 0
EN

Stack Overflow用户

发布于 2016-03-06 15:37:06

我认为问题来自于扩展SKNode的"unarchiveFromFile“函数。

尝试更改此行:

代码语言:javascript
复制
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameOverScene1 

要这样做:

代码语言:javascript
复制
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! SKScene

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32159641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档