Загрузить сцену из спрайтекита из другого пакета? - PullRequest
0 голосов
/ 06 июня 2018

Я делаю инфраструктуру SpriteKit, используя swift 4.2, и хочу включить некоторые файлы .sks для сцен и действий.Я попытался загрузить сцену из пакета, используя код ниже:

class func newGameScene() -> GameScene {

guard let gameScenePath = Bundle(for: self).path(forResource: "GameScene", ofType: "sks") else { assert(false) }

guard let gameSceneData = FileManager.default.contents(atPath: gameScenePath) else { assert(false) }

let gameSceneCoder = NSKeyedUnarchiver(forReadingWith: gameSceneData)

guard let scene = GameScene(coder: gameSceneCoder) else { assert(false) }


// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFill

return scene

}

Я загружаю сцену и представляю ее.(Этот код в основном взят из шаблона Apple для SpriteKit, так как я тестирую эту проблему.)

guard let view = view else {
      return nil
    }

    let scene = GameScene.newGameScene()

    view.presentScene(scene)

    view.ignoresSiblingOrder = true
    view.showsFPS = true
    view.showsNodeCount = true
    return nil

В этом случае GameScene.sks и код не отличаются от шаблона Apple.Этот код и активы .sks находятся в динамической среде и импортированы в другой проект.

Когда платформа загружает сцену в представление, которое я передаю, оно показывает количество кадров в секунду и число узлов, но не «Hello»., Мир!"текст.

В приведенном ниже коде, также скопированном из шаблона, точка останова показывает, что они не вызываются при отключении мыши.

    #if os(OSX)
// Mouse-based event handling
extension GameScene {

  override func mouseDown(with event: NSEvent) {
    if let label = self.label {
      label.run(SKAction.init(named: "Pulse")!, withKey: "fadeInOut")
    }
    self.makeSpinny(at: event.location(in: self), color: SKColor.green)
  }

  override func mouseDragged(with event: NSEvent) {
    self.makeSpinny(at: event.location(in: self), color: SKColor.blue)
  }

  override func mouseUp(with event: NSEvent) {
    self.makeSpinny(at: event.location(in: self), color: SKColor.red)
  }

}
#endif

Я знаю, что это должно быть связано с загрузкой SpritKit.сцена, но не может найти решение.Я должен использовать NSKeyedUnarchiver, потому что встроенный в SpritKit инициализатор файлов:

GameScene(fileNamed: "GameScene")

Загружается только из основного пакета.

Теперь в приведенном выше предположении, что файл можно загрузить с помощьюкодер, но Tomato указал, что sks, скорее всего, не был сохранен с помощью кодера.В этом случае может быть невозможно загрузить файл sks из другого пакета в sprite-kit, используя предоставленный API от Apple.Ответ может не включать кодеров.

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

Я собрал вышеупомянутое обсуждение / решение в одну функцию расширения на SKScene.Надеюсь, это кому-нибудь поможет!

import SpriteKit

extension SKScene {
    static func fromBundle(fileName: String, bundle: Bundle?) -> SKScene? {
        guard let bundle = bundle else { return nil }
        guard let path = bundle.path(forResource: fileName, ofType: "sks") else { return nil }
        if let data = FileManager.default.contents(atPath: path) {
            return NSKeyedUnarchiver.unarchiveObject(with: data) as? SKScene
        }
        return nil
    }
}
0 голосов
/ 07 июня 2018

Как я и думал, let gameSceneCoder = NSKeyedUnarchiver(forReadingWith: gameSceneData) не создавал для вас подходящего кодера.

Просто выполните

guard let scene = NSKeyedUnarchiver.unarchiveObject(with: gameSceneData) as? SKScene
        else{
            assert(false)
    }

. Это позволит вам правильно разархивировать файл.

Обратите внимание, если вы хотите использовать GameScene, убедитесь, что GameScene установлен в пользовательском классе файла SKS

...