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

xcode – SpriteKit unarchiveFromFile不会从资产目录和地图集加载纹理,第1张

概述我还是SpriteKit的新手,想看看我是否可以使用 Xcode的SKS编辑器构建一个关卡.当我添加一些带有“Spaceship.png”纹理的精灵并构建模板应用程序时,纹理不会加载. 这是使用Swift作为语言的vanilla OSX游戏模板的屏幕截图,并添加了一个提供的“Spaceship.png”精灵.纹理显示很好: 这里是构建和运行应用程序的结果,只对模板进行了修改: 调试控制台显示以下警 我还是SpriteKit的新手,想看看我是否可以使用 Xcode的SKS编辑器构建一个关卡.当我添加一些带有“Spaceship.png”纹理的精灵并构建模板应用程序时,纹理不会加载.

这是使用Swift作为语言的vanilla OSX游戏模板的屏幕截图,并添加了一个提供的“Spaceship.png”精灵.纹理显示很好:

这里是构建和运行应用程序的结果,只对模板进行了修改:

调试控制台显示以下警告消息:

我试图添加.atlas文件夹,并得到相同的结果.场景只显示红色X图标代替精灵.如果添加的精灵只是颜色精灵,它们显示正常.前段时间我有一个应用程序,我已经废弃了,我曾经加载过SKScene,并且会手动将精灵资产添加到我的SKScene子类中,它运行正常.

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

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

这是理想的结果:

我尝试通过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类–SKNode,SKScene,SKTexture,SKSPriteNode – 以获取有关路径,缓存,预加载或其他任何东西的任何线索,但无法找到可以使其工作的东西.

我正在运行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加载纹理,但我似乎无法用干净的模板做到这一点!

解决方法 [在这里回答我自己的问题]

据我所知,此时,根据我的尝试和上面引用的devforumns帖子,在资源​​目录中加载纹理 – Images.xcassets – 同时取消归档或反序列化SKScene文件在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定律:

If it works,don’t fix it

总结

以上是内存溢出为你收集整理的xcode – SpriteKit unarchiveFromFile不会从资产目录和地图集加载纹理全部内容,希望文章能够帮你解决xcode – SpriteKit unarchiveFromFile不会从资产目录和地图集加载纹理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1022634.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存