2015-02-05 9 views
5

Sono ancora nuovo con SpriteKit e volevo vedere se posso costruire un livello utilizzando l'editor SKS di Xcode. Quando ho aggiunto un paio di sprite con la texture "Spaceship.png" e ho creato l'app modello, le trame non vengono caricate.SpriteKit unarchiveFromFile non carica textures da cataloghi e atlanti di risorse

Ecco uno screenshot del modello di gioco OSX vanilla utilizzando Swift come lingua e aggiungendo uno sprite "Spaceship.png" in dotazione. La texture mostra bene: Sprite texture shows fine in the SKScene editor Ed ecco il risultato della costruzione e la gestione l'applicazione solo con modifiche al modello: enter image description here

console di debug visualizza questo messaggio di avviso: enter image description here Ho provato ad aggiungere un .atlas cartella e ottenuto lo stesso risultato. la scena mostra solo l'icona X rossa al posto dello sprite. Se gli sprite aggiunti sono solo sprites a colori, vengono visualizzati correttamente. Ho avuto un'app qualche tempo fa che ho scartato, dove caricavo SKScene e avrei aggiunto manualmente gli asset sprite all'interno della mia sottoclasse SKScene, e ha funzionato bene.

Se, tuttavia, ho spostato le trame - "Spaceship.png" come esempio - alla radice del progetto, cioè non all'interno di un catalogo di risorse o di una cartella .atlas, la scena viene caricata con le trame che vengono visualizzate correttamente.

Ecco la trama aggiunto alla base del progetto:

enter image description here

E questo è il risultato desiderato: enter image description here Ho provato ad aggiungere manualmente gli asset caricati dal file SKS alla scena via enumerateChildNodesWithName(_,usingBlock) e ottengo lo stesso risultato se le trame non erano nella radice della cartella del progetto.

Si tratta di me cercando di aggiungere le attività manualmente:

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) 
    } 
} 

mi sono guardato intorno classi SpriteKit - SKNode, SKScene, SKTexture, SKSPriteNode - per qualsiasi indizio sui percorsi, caching, precarico, o qualsiasi cosa, ma non era in grado per trovare una cosa che potrebbe far funzionare questo

Sto eseguendo Xcode 6.1.1 e il mio obiettivo è 10.9, e la lingua che sto usando è Swift, sebbene lo stesso comportamento sia vero usando ObjC. È una caratteristica o un bug? Qualcun altro in esecuzione/corse in una situazione simile?

Grazie in anticipo per qualsiasi aiuto

[UPDATE]

appare come questa non è ancora implementata - texture di carico dai cataloghi di attività - come questo post nei forum dev discute lo stesso problema e la sua soluzione è rinominare i cataloghi delle risorse con lo stesso nome della trama. In sostanza, quello che ho scoperto sull'avere i file immagine nella cartella radice: How do you load sprite textures from Images.xcassets when using SKS scene file, anche se la mia app precedente, che sono riuscito a ripristinare lo stato di funzionamento, carica le trame da .atlas, ma non riesco a sembrare fallo con un modello pulito !!!

+0

hai provato a fare una pulizia poi costruire? Ho avuto un sacco di problemi con l'editor delle scene. Volevo davvero usarlo per lo sviluppo del mio gioco, ma era troppo buggato e incompleto sulle funzionalità. –

+0

L'ho fatto. Ho persino iniziato un nuovo modello pulito da zero come mostrato sopra. l'unica modifica che ho fatto è stata quella di aggiungere uno sprite strutturato al file 'GameScene.sks'. Una cosa curiosa, però, è che una versione iOS dello stesso modello funzioni bene, senza gli avvertimenti di 'SKTexture'. Quindi, sto iniziando a pensare che potrebbe essere un problema di target OSX. Anche se, funziona bene a partire da iOS 7.0. Inoltre ha funzionato prima in un'app che ho creato un errore, poiché stavo caricando risorse sprite da un file SKS e aggiungendole manualmente alla mia scena senza problemi. –

risposta

4

[Rispondendo alla mia domanda proprio qui]

Per quanto posso dire, in questo momento, il caricamento di texture da cataloghi di attività - Images.xcassets - mentre unarchiving o deserializzazione un file SKScene non funziona su OSX sulla base di miei tentativi e i post di sviluppo che fanno riferimento sopra.

Il caricamento delle trame dagli atlanti di immagine, tuttavia, funziona forzando SKTexture per caricare l'immagine. Forzare o "toccare" SKTexture può essere fatto tramite i metodi preloadWithCompletionHandler(_:) o preloadTextures(_:, withCompletionHandler:), o semplicemente stampando la descrizione dellodello sprite come ho scoperto.

A beneficio di tutti coloro che potrebbero aver bisogno di ulteriore assistenza, ecco un frammento di codice che precarica le texture dopo unarchiving un file 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 ... */ 
    ... 
} 

Se mi sbaglio per favore correggetemi. Fino a quando qualcuno lo fa, o Apple risolve la discrepanza tra il comportamento del SpriteKit tra iOS e OSX, non sarò alla ricerca di un'altra soluzione, e seguirò la legge di Murphey:

Se funziona, non risolvere il problema

1

di soluzione Segui Salam Horani, per 2.x Swift non avete ancora "unarchiveFromFile" in modo da poter creare scena come questa:

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