在场景之间传递时加载animation

我正在使用Swift制作iOS游戏。 在菜单(菜单是SKScene)中,我有一个启动游戏的button,我们称之为“开始button”。 当我点击开始button,应用程序冻结并加载游戏(游戏是一个SKScene),然后过渡animation运行和游戏开始。 但是,而不是冻结的应用程序,我想要一个旋转的加载循环,而应用程序加载游戏。 我怎样才能做到这一点? 问我有没有不清楚的地方

func loadingScreen(scene:SKScene) { var loadingSprite = SKSpriteNode(imageNamed: "loading.png") loadingSprite.size = CGSize(width: 100, height: 100) loadingSprite.position = CGPoint(x: self.size.width/2, y: self.size.height/2) loadingSprite.zPosition = 10 self.addChild(loadingSprite) loadingSprite.runAction(SKAction.repeatActionForever(SKAction.rotateByAngle(3, duration: 0.5))) let qualityOfServiceClass = QOS_CLASS_BACKGROUND let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) dispatch_async(backgroundQueue, { dispatch_async(dispatch_get_main_queue(), { () -> Void in self.view!.presentScene(scene, transition: SKTransition.fadeWithDuration(1.0)) }) }) } 

它是secondScene的初始化程序;

 convenience init (size:CGSize,mode:String) { self.init(size:size) self.gameMode = mode loadItems() //loads my custom objects printSlider() // printing sprites depending to my objects } 

这里是我如何处理在我的游戏中加载一个场景。 我添加一个节点到菜单场景,并对其应用一个动作来保持animation效果。 然后,我在后台线程上初始化我的场景,以便主线程不被阻塞(记住主线程处理可视化渲染)。 最后,场景完成加载后,我将场景呈现在主线程上。 下面是它的代码。

 let loadingSprite = YourLoadingSprite() self.sceneView.scene!.addChild(loadingSprite) let qualityOfServiceClass = QOS_CLASS_BACKGROUND let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) dispatch_async(backgroundQueue, { self.gameScene = GameScene() dispatch_async(dispatch_get_main_queue(), { () -> Void in self.sceneView.presentScene(self.gameScene, transition: SKTransition.fadeWithDuration(1.0)) }) }) 

更新
在你的代码中,你不是在后台线程上初始化场景。 当这个方法被调用时,你的场景已经被初始化了。 你需要在这个方法中初始化你的场景,但是把它分派到后台线程上。 在下面的代码中,我提出了一个评论,显示你应该在哪里初始化你的场景。

 func loadingScreen() { var loadingSprite = SKSpriteNode(imageNamed: "loading.png") loadingSprite.size = CGSize(width: 100, height: 100) loadingSprite.position = CGPoint(x: self.size.width/2, y: self.size.height/2) loadingSprite.zPosition = 10 self.addChild(loadingSprite) loadingSprite.runAction(SKAction.repeatActionForever(SKAction.rotateByAngle(3, duration: 0.5))) let qualityOfServiceClass = QOS_CLASS_BACKGROUND let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) dispatch_async(backgroundQueue, { //Initialize the scene here! let scene = YourScene() dispatch_async(dispatch_get_main_queue(), { () -> Void in self.view!.presentScene(scene, transition: SKTransition.fadeWithDuration(1.0)) }) }) } 

在后台线程( performSelectorInBackground )中启动加载代码,然后在主线程中显示animation。 后台线程将在animation并行运行时执行其操作。

后台线程不能直接更新animation,但可以定期调用主线程( performSelectorOnMainThread )并让主线程进行更新。

当后台线程完成后,调用一个mainthread函数( performSelectorOnMainThread ),告诉它停止animation并继续下一个场景。

类似的问题可能会有所帮助: 在循环期间更新UIProgressBar进度