SpriteKit unarchiveFromFile不会从资产目录和地图集加载纹理

时间:2015-02-05 13:56:31

标签: xcode macos swift sprite-kit

我还是SpriteKit的新手,想看看我是否可以使用Xcode的SKS编辑器构建关卡。当我添加几个精灵与" Spaceship.png"纹理和构建模板应用程序,纹理不会加载。

这里是使用Swift作为语言的vanilla OSX游戏模板的屏幕截图,并添加了一个提供的" Spaceship.png"精灵。纹理显示很好: Sprite texture shows fine in the SKScene editor 以下是构建和运行应用程序的结果,只对模板进行了修改: enter image description here

调试控制台显示以下警告消息: enter image description here 我试图添加.atlas文件夹,并得到相同的结果。场景只显示红色X图标代替精灵。如果添加的精灵只是颜色精灵,它们显示正常。前段时间我有一个应用程序,我已经废弃了,我曾经加载过SKScene并手动将精灵资产添加到我的SKScene子类中,它运行良好。

然而,如果我移动纹理 - " Spaceship.png"例如 - 对于项目的根,即不在资产目录或.atlas文件夹中,场景加载时纹理显示正常。

这是添加到项目根目录的纹理:

enter image description here

这是理想的结果: enter image description here 我试图通过enumerateChildNodesWithName(_,usingBlock)手动将SKS文件中加载的资源添加到场景中,如果纹理不在项目文件夹的根目录中,我会得到相同的结果。

这是我尝试手动添加资产:

    func applicationDidFinishLaunching(aNotification: NSNotification) {
    /* Pick a size for the scene */
    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
        let sceneToBePresented = GameScene()

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

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

        self.skView!.showsFPS = true
        self.skView!.showsNodeCount = true
        scene.enumerateChildNodesWithName("*") { node, stop in
            sceneToBePresented.addChild(node.copy() as SKSpriteNode)
        }

        self.skView!.presentScene(sceneToBePresented)
    }
}

我查看了SpriteKit类 - SKNodeSKSceneSKTextureSKSPriteNode - 有关路径,缓存,预加载或任何其他但无法找到的任何线索这可以使这项工作。

我正在运行Xcode 6.1.1,我的目标是10.9,我使用的语言是Swift,尽管使用ObjC也是如此。这是一个功能还是一个bug?还有其他人跑/遇到类似情况吗?

提前感谢您提供任何帮助

[UPDATE]

看起来这还没有实现 - 从资产目录中加载纹理 - 因为开发论坛中的这篇文章讨论了同样的问题,他的解决方案是将资产目录重命名为与纹理相同的名称。本质上,我发现将图像文件放在根文件夹中How do you load sprite textures from Images.xcassets when using SKS scene file,虽然我设法回滚到工作状态的早期应用程序确实从.atlas' es加载纹理,但是我似乎无法用干净的模板做到这一点!!!

2 个答案:

答案 0 :(得分:4)

[在这里回答我自己的问题]

据我所知,此时,从资产目录中加载纹理 - Images.xcassets - 同时取消归档或反序列化SKScene文件根据我的尝试和devforumns帖子在OSX上不起作用以上引用。

然而,通过强制SKTexture加载图像,从图像地图集加载纹理起作用。强制或“触摸”SKTexture可以通过preloadWithCompletionHandler(_:)preloadTextures(_:, withCompletionHandler:)方法完成,或者只是打印我发现的精灵SKTexture的描述。

为了任何可能需要进一步帮助的人的利益,这里有一个代码片段,在取消归档SKS文件后预加载纹理:

if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
    for child in scene.children as [SKNode] {
        if child is SKSpriteNode {
            let sprite = child as SKSpriteNode
            sprite.texture?.preloadWithCompletionHandler({ })
            /* or even a simple debug log of the texture */
            /* println(sprite.texture) */
        }
    }
    /* Do your other stuff ... */
    ...
}

如果我错了请纠正我。直到有人,或者Apple修复了SpriteKit在iOS和OSX之间的行为之间的差异,我不会寻找另一种解决方案,并且会遵循Murphey定律:

  

如果有效,请不要修理

答案 1 :(得分:1)

关注Salam Horani解决方案,对于Swift 2.x,你还没有" unarchiveFromFile"所以你可以创建这样的场景:

if let gameScene = GameScene(fileNamed: "GameScene") {
    // ...
}