SpriteKit — предварительный загрузчик с использованием GCD

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

Я смотрю на приключенческую игру Apple, и есть пример подобной проблемы. Собственно, первая часть решена. Но я нигде не могу найти информацию об обновлении предварительного загрузчика в зависимости от количества загруженных данных, поэтому любые инструкции будут полезны. Должен быть какой-то очевидный способ вычислить или получить информацию о данных, загруженных в фоновую очередь.


person Whirlwind    schedule 31.12.2014    source источник
comment
Я сделал предварительный загрузчик и мог бы опубликовать код для него, но я не знаю, как сделать индикатор выполнения. Мне было бы интересно это увидеть.   -  person hamobi    schedule 31.12.2014
comment
Было бы неплохо, если бы вы могли опубликовать код или только соответствующие части, потому что по этому поводу не так много руководств. Но это зависит от вас... В любом случае, я обновлю пост, если найду что-то интересное, но я уверен, что есть способ сделать это с помощью централизованной диспетчеризации...   -  person Whirlwind    schedule 01.01.2015


Ответы (1)


Я не делаю никаких индикаторов выполнения, так как мои уровни загружаются примерно за секунду. У меня плавный переход между уровнями. До того, как я поступал таким образом, моя игра на мгновение зависала в переходе, потому что ей приходилось загружать все ресурсы в том же потоке, что и моя игра.

Я создаю в своем классе статический метод для предварительной загрузки ресурсов.

// config is a struct with many parameters
class func createResources(config: HyperSceneConfig, withCompletion: (scene: HyperScene) -> ()){

    // load resources on other thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {

        let hyperScene = HyperScene(config: config)

        // callback on main thread
        dispatch_async(dispatch_get_main_queue(), {
            // Call the completion handler back on the main queue.
            withCompletion(scene: hyperScene)
        });
    })

}

мои сцены запускаются

init(config: HyperSceneConfig) {


    super.init(size: config.size, viewController: config.viewController)

    self.backgroundColor = SKColor.blackColor()

    self.levelTime = 200

    // this is where i do all my setup before the scene is presented
    self.setupScene()
}

вот как я представляю свою сцену в своем gameViewController.

Вы можете сделать то же самое в сцене, чтобы загрузить следующий уровень. Это здорово, потому что вы можете создать плавный переход между уровнями, поскольку все загружается в другом потоке.

HyperScene.createResources(hyperConfig, withCompletion: {
    scene in
    self.scene = scene
    self.scene.scaleMode = .AspectFill
    self.skView.presentScene(self.scene)
    self.view.addSubview(self.skView)
})
person hamobi    schedule 01.01.2015
comment
Я понимаю. Если в ближайшее время не будет другого ответа о индикаторе выполнения, я приму текущий ответ как действительный, потому что он решает проблему предварительной загрузки. - person Whirlwind; 01.01.2015