2014-12-31 4 views
1

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

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

+0

Я сделал предварительный загрузчик и могу опубликовать код для этого, но я не знаю, как сделать индикатор выполнения. Мне было бы интересно увидеть это. – hamobi

+0

Было бы неплохо, если бы вы могли опубликовать код или только соответствующие части, потому что в этом нет много учебников. Но это зависит от вас ... Во всяком случае, я обновлю сообщение, если найду что-то интересное, но я уверен, что есть способ сделать это с помощью большой центральной отправки ... – Whirlwind

ответ

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

Я понимаю. Если в ближайшее время нет другого ответа о баре прогресса, я буду принимать текущий ответ как действительный, потому что он решает проблему предварительной загрузки. – Whirlwind

Смежные вопросы