Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode SpriteKit unarchiveFromFile不会从资源目录和地图集加载纹理_Xcode_Macos_Swift_Sprite Kit - Fatal编程技术网

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

Xcode SpriteKit unarchiveFromFile不会从资源目录和地图集加载纹理,xcode,macos,swift,sprite-kit,Xcode,Macos,Swift,Sprite Kit,我还是SpriteKit新手,想看看是否可以使用Xcode的SKS编辑器构建一个级别。当我添加了两个带有“Spaceship.png”纹理的精灵并构建了模板应用程序时,这些纹理不会加载 下面是使用Swift作为语言的香草OSX游戏模板的屏幕截图,并添加了提供的“Spaceship.png”精灵。纹理显示精细: 以下是仅对模板进行修改即可构建和运行应用程序的结果: 调试控制台显示以下警告消息: 我尝试添加一个.atlas文件夹,得到了相同的结果。场景只显示红色的X图标来代替精灵。如果添加的精灵中

我还是SpriteKit新手,想看看是否可以使用Xcode的SKS编辑器构建一个级别。当我添加了两个带有“Spaceship.png”纹理的精灵并构建了模板应用程序时,这些纹理不会加载

下面是使用Swift作为语言的香草OSX游戏模板的屏幕截图,并添加了提供的“Spaceship.png”精灵。纹理显示精细: 以下是仅对模板进行修改即可构建和运行应用程序的结果:

调试控制台显示以下警告消息: 我尝试添加一个.atlas文件夹,得到了相同的结果。场景只显示红色的X图标来代替精灵。如果添加的精灵中只有彩色精灵,则它们显示良好。不久前我有一个应用程序被我废弃了,我用它来加载SKScene并将其中的精灵资源手动添加到我的SKScene子类中,它工作得很好

但是,如果我将纹理(“Spaceship.png”作为示例)移动到项目的根目录中,即不在资源目录或.atlas文件夹中,则场景加载时纹理显示良好

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

这是期望的结果: 我试图通过
enumerateChildNodesWithName(uu,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类——
SKNode
SKScene
SKTexture
SKSPriteNode
——寻找有关路径、缓存、预加载或其他方面的任何线索,但找不到可以实现这一点的方法

我运行的是Xcode 6.1.1,目标是10.9,我使用的语言是Swift,尽管使用ObjC时同样的行为也适用。这是一个特性还是一个bug?还有谁遇到过类似的情况吗

提前谢谢你的帮助

[更新]


看起来这还没有实现-从资产目录加载纹理-因为dev论坛中的这篇文章讨论了相同的问题,他的解决方案是将资产目录重命名为与纹理相同的名称。从本质上说,我发现在根文件夹中有图像文件:,虽然我以前的应用程序(我设法回滚到工作状态)确实从.atlas加载纹理,但我似乎无法使用干净的模板

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

据我所知,目前,从资产目录加载纹理-
Images.xcsets
,同时取消归档或反序列化
SKScene
文件,基于我的尝试和上面提到的devforumns post,在OSX上不起作用

但是,从图像地图集加载纹理是通过强制
SKTexture
加载图像来实现的。可以通过
Preload withCompletionHandler(:)
Preload Textures(:,withCompletionHandler:)
方法强制或“触摸”SKTexture,或者像我发现的那样,只需打印精灵的
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 ... */
    ...
}
如果我错了,请纠正我。除非有人这样做,或者苹果修复了SpriteKit在iOS和OSX之间的行为差异,否则我不会寻找另一种解决方案,并将遵循Murphey定律:

如果它有效,就不要修复它


遵循Salam Horani的解决方案,对于Swift 2.x,您还没有“unarchiveFromFile”,因此您可以创建如下场景:

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

你有没有试着做一个干净的然后建造?我对场景编辑器有很多问题。我真的很想把它用于我的游戏开发,但它的功能太多了,而且不完整。我做到了。我甚至从头开始创建了一个新的干净模板,如上图所示。我所做的唯一修改就是在
gamesence.sks
文件中添加了一个带纹理的精灵。不过,有一点很奇怪,相同模板的iOS版本运行良好,没有任何警告。所以,我开始认为这可能是OSX的目标问题。尽管如此,它在低至iOS 7.0的环境下仍能正常工作。另外,它以前在我搞砸的一个应用程序中也能工作,因为我从一个SKS文件加载sprite资源,并将它们手动添加到我的场景中,没有任何问题。