如何重命名iOS SpriteKit模板中的默认场景?

时间:2016-07-21 15:38:51

标签: ios swift xcode sprite-kit swift3

我对Swift和iOS开发都很​​陌生。

我一直在开发基于Apple的SpriteKit(带有GameplayKit集成)模板的游戏。

一切正常,直到我将GameScene.swift和GameScene.sks重命名为MapMainScene.swift和MapMainScene.sks。我确保在GameViewController.swift中更改此代码:

override func viewDidLoad() {
    super.viewDidLoad()

    // Load 'GameScene.sks' as a GKScene. This provides gameplay related content
    // including entities and graphs.
    if let scene = GKScene(fileNamed: "GameScene") {

        // Get the SKScene from the loaded GKScene
        if let sceneNode = scene.rootNode as! GameScene? {

            // Copy gameplay related content over to the scene
            sceneNode.entities = scene.entities
            sceneNode.graphs = scene.graphs

            // Set the scale mode to scale to fit the window
            sceneNode.scaleMode = .aspectFill

            // Present the scene
            if let view = self.view as! SKView? {
                view.presentScene(sceneNode)

                view.ignoresSiblingOrder = true

                view.showsFPS = true
                view.showsNodeCount = true
            }
        }
    }
}

为:

override func viewDidLoad() {
    super.viewDidLoad()

    // Load 'MainMapScene.sks' as a GKScene. This provides gameplay related content
    // including entities and graphs.
    if let scene = GKScene(fileNamed: "MainMapScene") {

        // Get the SKScene from the loaded GKScene
        if let sceneNode = scene.rootNode as! MainMapScene? {

            // Copy gameplay related content over to the scene
            sceneNode.entities = scene.entities
            sceneNode.graphs = scene.graphs

            // Set the scale mode to scale to fit the window
            sceneNode.scaleMode = .aspectFill

            // Present the scene
            if let view = self.view as! SKView? {
                view.presentScene(sceneNode)

                view.ignoresSiblingOrder = true

                view.showsFPS = true
                view.showsNodeCount = true
            }
        }
    }
}

我还更改了Gamescene.swift中的以下内容:

class GameScene: SKScene {
    // Some code
}
MainMapScene.swift

class MainMapScene: SKScene {
    // Some code
}

但应用程序在启动时崩溃了。控制台的输出说:

2016-07-21 16:29:35.593592 MyGame[10656:1944648] [User Defaults] CFPrefsPlistSource<0x6080000e5e00> (Domain: kCFPreferencesAnyApplication, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)) is waiting for writes to complete so it can determine if new data is available
2016-07-21 16:29:35.603729 MyGame[10656:1944648] [FenceWorkspace] creating a CA fence port (5d13)
2016-07-21 16:29:35.638 MyGame[10656:1944648] *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (GameScene) for key (root); the class may be defined in source code or a library that is not linked'
*** First throw call stack:

所以看起来在我的项目中某个地方仍然有GameScene的引用,但我已经完成了项目范围的搜索,并且找不到GameScene

我确信这是非常简单的事情。我是否需要更改故事板编辑器中的插座或内容?我可以通过尝试在新项目中更改GameScene的名称来重现此问题,因此我知道这不是我项目的特定内容。

1 个答案:

答案 0 :(得分:4)

GameScene实际上是在另一个地方引用的,来自NSKeyedArchiver的错误应该让您知道在哪里:它在您正在加载的.sks文件中进行编码。您可以在Xcode编辑器中.sks文件的“自定义类”选项卡中找到它。

Custom Class Tab

此设置告诉NSKeyedUnarchiver加载.sks文件时编码的场景应该是什么类。这应该是对GameScene的最后剩余引用,因此这应该完成您的重命名!