SpriteKit - 使用GCD的Preloader

时间:2014-12-31 01:56:51

标签: objective-c preloader dispatch

我正在寻找如何使用GCD制作预加载器的说明,但现在没有运气。我想学习如何在场景初始化之前预加载背景中的所有纹理和发射器。如果可能,根据加载的数据量更新进度条动画。

我在看Apple的冒险游戏,并且有类似问题的例子。实际上,第一部分已经解决了。但我无法根据加载的数据量找到更新预加载器的任何地方,因此任何说明都会有所帮助。必须有一些明显的方法,计算或获取有关后台队列中加载的数据的信息。

1 个答案:

答案 0 :(得分: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)
})