2015-02-05 78 views
5

我還是SpriteKit的新手,並且想知道是否可以使用Xcode的SKS編輯器構建一個關卡。當我用「Spaceship.png」紋理添加了幾個精靈並構建了模板應用程序時,紋理不會加載。SpriteKit unarchiveFromFile不會從資產目錄和圖集加載紋理

下面是使用Swift作爲語言的vanilla OSX Game模板截圖,並添加了一個提供的「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 我試圖手動從SKS文件通過添加加載的資產到現場enumerateChildNodesWithName(_,usingBlock),如果紋理不在項目文件夾的根目錄下,我會得到相同的結果。

這是我嘗試手動添加的資產:

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時同樣的行爲也是如此。這是一個功能還是錯誤?其他人跑步/遇到類似的情況?從資產目錄加載紋理 - -

預先感謝任何幫助

[更新]

看起來這是尚未實現,因爲這帖子在開發論壇討論了同樣的問題,他的解決方案將資產目錄重命名爲與紋理相同的名稱。從本質上講,我發現有關在根文件夾中有圖像文件:How do you load sprite textures from Images.xcassets when using SKS scene file,雖然我設法回滾到工作狀態的早期應用程序確實從.atlas'es加載紋理,但我似乎無法做一個乾淨的模板!

+0

你嘗試做一個乾淨的再建? 我在場景編輯器中遇到了很多問題。我真的很想將它用於我的遊戲開發,但它的功能太多,並且不完整。 – 2015-02-06 07:11:15

+0

我做到了。我甚至從頭開始創建一個新的乾淨模板,如上所示。我做的唯一修改是向'GameScene.sks'文件添加紋理精靈。有一件事很奇怪,不過,同樣模板的iOS版本可以正常工作,沒有'SKTexture'警告。所以,我開始認爲這可能是一個OSX目標問題。儘管如此,它可以在iOS 7.0的情況下正常工作。此外,它在我拙劣的應用程序中工作過,因爲我從SKS文件加載精靈資源並將它們手動添加到我的場景中,沒有任何問題。 – 2015-02-06 08:09:27

回答

4

[接聽這裏我自己的問題]

據我所知,在這一刻,裝載從資產目錄質感 - Images.xcassets - 而解除存檔或反序列化SKScene文件基於我嘗試在OSX不起作用和上面引用的devforumns帖子。

但是,從圖像地圖集加載紋理的方法是通過強制SKTexture加載圖像。可以通過preloadWithCompletionHandler(_:)preloadTextures(_:, 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之間的行爲之間的差異,我不會尋找另一個解決方案,並且將按照墨菲定律:

如果一切正常,不解決它

1

關注薩拉姆Horani解決方案的,你不要有沒有?「unarchiveFromFile」這樣你就可以創建情景是這樣雨燕2.X:

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