2015-02-05 10 views
5

Nadal jestem nowy w SpriteKit i chciałem sprawdzić, czy mogę skonstruować poziom za pomocą edytora SKS Xcode. Kiedy dodałem kilka ikonek z teksturą "Spaceship.png" i zbudowałem szablon aplikacji, tekstury nie ładują się.SpriteKit unarchiveFromFile nie ładuje tekstur z katalogów zasobów i atlasów

Oto zrzut ekranu szablonu gry Vanilla OSX wykorzystujący Swift jako język i dodanie ikonki "Spaceship.png". Tekstury pokazuje dobrze: Sprite texture shows fine in the SKScene editor A oto wynik budynku i uruchamiając aplikację tylko z tej modyfikacji szablonu: enter image description here

debug konsola wyświetla ten komunikat ostrzegawczy: enter image description here Próbowałem dodać .atlas folder i uzyskał taki sam wynik. scena po prostu wyświetla czerwoną ikonę X zamiast ikonki. Jeśli dodane sprite'y, w których po prostu kolorowe duszki, wyświetlają się dobrze. Miałem kiedyś aplikację, którą złomowałem, gdzie ładowałem SKScene i ręcznie dodawałem zasoby sprite'a do mojej podkategorii SKScene, i wszystko działało dobrze.

Jeśli jednak przeniosłem tekstury - "Spaceship.png" jako przykład - do katalogu głównego projektu, tj. Nie wewnątrz katalogu zasobów lub folderu .atlas, scena ładuje się z teksturami wyświetlającymi się w porządku.

Oto tekstury dodaje do głównego projektu:

enter image description here

A to pożądany rezultat: enter image description here Próbowałem ręcznie dodać obciążonych aktywów z pliku SKS na scenę poprzez enumerateChildNodesWithName(_,usingBlock) i otrzymam taki sam wynik, jeśli tekstury nie znajdowały się w katalogu głównym folderu projektu.

to ja próbuje dodać aktywa ręcznie:

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

Rozejrzałem klas SpriteKit - SKNode, SKScene, SKTexture, SKSPriteNode - dla pojęcia o ścieżkach, buforowanie, obciążenia wstępnego, czy cokolwiek, ale nie był w stanie znaleźć coś, co może sprawić, że to zadziała.

Używam Xcode 6.1.1, a moim celem jest 10.9, a językiem, którego używam jest Swift, chociaż to samo zachowanie jest prawdziwe przy użyciu ObjC. Czy to jest funkcja czy błąd? Ktoś jeszcze biegał/borykał się z podobną sytuacją?

Dzięki z góry za wszelką pomoc

[UPDATE]

wygląda to nie jest jeszcze zaimplementowana - ładowanie tekstur z katalogów aktywów - jako ten post na forach dev omawia ten sam problem i jego rozwiązanie to zmienić nazwy katalogów zasobów tak, aby miały taką samą nazwę jak tekstury. W istocie, dowiedziałem się o plikach obrazów w folderze głównym: How do you load sprite textures from Images.xcassets when using SKS scene file, chociaż moja wcześniejsza aplikacja, którą udało mi się przywrócić do stanu roboczego, ładuje tekstury z .atlas'es, ale nie mogę zrób to z czystym szablonem !!!

+0

Próbowałeś robić czyste następnie zbudować? Mam wiele problemów z edytorem scen. Naprawdę chciałem go użyć do rozwoju mojej gry, ale było to zbyt skomplikowane i niekompletne w działaniu. –

+0

Zrobiłem. Zacząłem nawet nowy czysty szablon od zera, jak pokazano powyżej. jedyną modyfikacją, którą zrobiłem, było dodanie sprite teksturowanego do pliku 'GameScene.sks'. Ciekawe jest jednak, że wersja tego samego szablonu na iOS działa dobrze, bez ostrzeżeń "SKTexture". Tak, zaczynam myśleć, że to może być problem docelowy OSX. Mimo, że działa dobrze na tak niskim jak iOS 7.0. Plus działało wcześniej w aplikacji, którą spartaczyłem, ponieważ ładowałem zasoby sprite z pliku SKS i dodawałem je ręcznie do mojej sceny bez problemów. –

Odpowiedz

4

[Odpowiadając na moje własne pytanie tutaj]

O ile mogę powiedzieć w tej chwili, załadunek teksturę z katalogów aktywów - Images.xcassets - podczas dearchiwizacja lub deserializacji plik SKScene nie działa na OSX na podstawie moich prób oraz devforumns, które zostały wymienione powyżej.

Ładowanie tekstur z atlasów obrazów działa jednak poprzez wymuszenie SKTexture załadowania obrazu. Wymuszanie lub "dotykanie" SKTexture może odbywać się metodami preloadWithCompletionHandler(_:) lub preloadTextures(_:, withCompletionHandler:) lub po prostu poprzez drukowanie opisu sprite'a SKTexture, tak jak to odkryłem.

Z korzyścią dla wszystkich, którzy mogą potrzebować dodatkowej pomocy, o to fragment kodu, który wstępnie załadować tekstury po dearchiwizacja plik 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 ... */ 
    ... 
} 

Jeśli się mylę proszę mnie poprawić. Dopóki ktoś robi lub Apple naprawia różnicę między zachowaniem SpriteKit, pomiędzy iOS i OS X, nie będzie szukał innego rozwiązania, a pójdą Murphey jest Prawo:

Jeśli to działa, nie należy go naprawić

1

Obserwuj Salam Horani Solution dla Swift 2.x nie masz jeszcze „unarchiveFromFile”, dzięki czemu można stworzyć scenę tak:

if let gameScene = GameScene(fileNamed: "GameScene") { 
    // ... 
} 
Powiązane problemy