我正在寻找如何使用GCD制作预加载器的说明,但现在没有运气。我想学习如何在场景初始化之前预加载背景中的所有纹理和发射器。如果可能,根据加载的数据量更新进度条动画。
我在看Apple的冒险游戏,并且有类似问题的例子。实际上,第一部分已经解决了。但我无法根据加载的数据量找到更新预加载器的任何地方,因此任何说明都会有所帮助。必须有一些明显的方法,计算或获取有关后台队列中加载的数据的信息。
答案 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)
})