【问题标题】:Cannot use unarchiveFromFile to set GameScene in SpriteKit无法使用 unarchiveFromFile 在 SpriteKit 中设置 GameScene
【发布时间】:2015-09-14 22:11:56
【问题描述】:

我正在使用 Xcode 7 beta 2 并按照 raywenderlich.com 的 Breakout 教程学习 SpriteKit。这是我尝试使用 unarchiveFromFile 加载 GameScene 时遇到的错误。

GameScene.type 没有名为 unarchiveFromFile 的成员。

代码如下:

func didBeginContact(contact: SKPhysicsContact) {
    // 1. Create local variables for two physics bodies
    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody

    // 2. Assign the two physics bodies so that the one with the lower category is always stored in firstBody
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    // 3. react to the contact between ball and bottom
    if firstBody.categoryBitMask == BallCategory && secondBody.categoryBitMask == BottomCategory {
        //TODO: Replace the log statement with display of Game Over Scene

        if let mainView = view {
            let gameOverScene = GameOverScene.unarchiveFromFile("GameOverScene") as! GameOverScene
            gameOverScene.gameWon = false
            mainView.presentScene(gameOverScene)
        }
    }
}

【问题讨论】:

  • class func unarchiveFromFile 在示例项目的 GameViewController.swift 中的自定义 extension SKNode 中定义。您是否将项目转换为“最后的 Swift 语法”?

标签: swift sprite-kit xcode7-beta2


【解决方案1】:

您应该使用 init(fileNamed:) 初始化程序,它从 iOS 8 开始可用。例如:

if let gameOverScene = GameOverScene(fileNamed: "GameOverScene") {
    // ...
}

重要的是要注意init(fileNamed:)SKNode 上的便利初始化器:

convenience init?(fileNamed filename: String)

因此,GameOverScene 要自动继承 init(fileNamed:)GameOverScene 必须遵守 The Swift Programming Language: Initialisation 的以下规则(尤其是规则 2):

假设您为在子类中引入的任何新属性提供默认值,则适用以下两条规则:

规则 1 如果你的子类没有定义任何指定的初始化器,它 自动继承其所有超类指定的初始化器。

规则 2 如果您的子类提供了所有它的实现 超类指定的初始化器——或者通过继承它们 规则 1,或者通过提供自定义实现作为其一部分 定义——然后它会自动继承所有的超类 便利初始化器。

【讨论】:

  • Ray Wenderlich 的示例项目中有一个 unarchiveFromFile 方法,它使用 NSKeyedUnarchiver 从 .sks 文件中实例化 SKNode 的(子类)实例,并且在我的快速测试中与 Xcode 7 一起工作没有问题。
  • 在这种情况下,OP 的代码还有其他问题,所以我的回答没有解决 actual 问题。但是,unarchiveFromFile 似乎不再被使用;它不包含在默认的 Sprite Kit 项目中,而是使用init(fileNamed: "...")
  • 您说得对,init(fileNamed:) 是在 iOS 8 SDK 中添加的,所以如果您的部署目标是 iOS 8(或更高版本),这将是更好的解决方案。但是,我仍然不清楚最初的问题,我可以下载示例项目并单击几下将其转换为 Swift 2 :)
  • Objective-C 中 init(fileNamed:) 的类比是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
相关资源
最近更新 更多