草庐IT

xcode - SpriteKit unarchiveFromFile 不会从 Assets 目录和图集中加载纹理

coder 2023-09-05 原文

我对 SpriteKit 还是个新手,想看看我是否可以使用 Xcode 的 SKS 编辑器构建关卡。当我添加几个带有“Spaceship.png”纹理的 Sprite 并构建模板应用程序时,纹理不会加载。

这是使用 Swift 作为语言并添加提供的“Spaceship.png” Sprite 的原始 OSX 游戏模板的屏幕截图。纹理显示良好: 这是仅对模板进行修改后构建和运行应用程序的结果:

调试控制台显示此警告消息: 我尝试添加一个 .atlas 文件夹,结果相同。场景只显示红色 X 图标代替 Sprite 。如果添加的 Sprite 只是彩色 Sprite ,它们显示良好。前段时间我废弃了一个应用程序,我曾经在其中加载 SKScene 并将 Sprite Assets 手动添加到我的 SKScene 子类中,并且运行良好。

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

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

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

这是我尝试手动添加 Assets :

    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 也有同样的行为。这是功能还是错误?还有其他人遇到过类似情况吗?

在此先感谢您的帮助

[更新]

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

最佳答案

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

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

然而,从图像图集中加载纹理是通过强制 SKTexture 加载图像来实现的。可以通过 preloadWithCompletionHandler(_:)preloadTextures(_:, withCompletionHandler:) 方法强制或“触摸”SKTexture,或者正如我所发现的,只需打印 Sprite 的 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 不会从 Assets 目录和图集中加载纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345805/

有关xcode - SpriteKit unarchiveFromFile 不会从 Assets 目录和图集中加载纹理的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  3. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  5. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  6. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

  7. ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别 - 2

    在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc

  8. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  9. ruby - Sinatra 找不到 View 目录 - 2

    我正在尝试以一种更类似于普通RubyGem结构的方式构建我的Sinatra应用程序。我有以下文件树:.├──app.rb├──config.ru├──Gemfile├──Gemfile.lock├──helpers│  ├──dbconfig.rb│  ├──functions.rb│  └──init.rb├──hidden│  └──Rakefile├──lib│  ├──admin.rb│  ├──api.rb│  ├──indexer.rb│  ├──init.rb│  └──magnet.rb├──models│  ├──init.rb│  ├──invite.rb│  ├─

  10. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

随机推荐