适用于ios7的SpriteKit GameScene兼容性



我的应用程序在iOS 8+上运行良好,但iOS 7把所有坐标都搞砸了复制ios 7 创建游戏场景的正确方法是什么

我是这样做的:

   if #available(iOS 8, *) {
    if let scene = GameScene(fileNamed:"GameScene") {
        self.skView = self.view as! SKView
        skView.ignoresSiblingOrder = true
        scene.scaleMode = .AspectFill
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "quitToLevel:", name: "quitToLevelID", object:nil)
        skView.presentScene(scene)
    }
     } else {
        //here starts the wrong part
        if let scene = GameScene(size: view.frame.size) as GameScene? {
            let skView = self.view as! SKView
            scene.scaleMode = .AspectFill
            NSNotificationCenter.defaultCenter().addObserver(self, selector: "quitToLevel:", name: "quitToLevelID", object:nil)
            skView.presentScene(scene)
        }
    }
extension SKNode {
    class func unarchiveFromFile(file : NSString) -> SKNode? {
        if let path = NSBundle.mainBundle().pathForResource(file as String, ofType: "sks") {
            var sceneData = try! NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe)
            var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
            archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
            let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! SKScene
            archiver.finishDecoding()
            return scene
        } else {
            return nil
        }
    }
}

不确定是否有区别,但您应该将else语句中的场景大小建立在skView.bounds.size 上

所以把它改成这个

 } else {
    //here starts the wrong part
    let skView = view as! SKView!
    let scene = GameScene(size: skView.bounds.size)
    scene.scaleMode = .AspectFill
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "quitToLevel:", name: "quitToLevelID", object:nil)
    skView.presentScene(scene)
}

看看它现在是否正常工作。

不确定这是否适用于ios 7,但值得一试。你需要你的应用程序来支持ios 7吗?只剩下10%的用户在运行特定的操作系统。

最新更新