我正在使用Swift制作iOS游戏。在菜单(菜单是SKScene)中,我有一个启动游戏的按钮,让我们称之为“开始按钮”。当我点击开始按钮时,应用程序冻结并加载游戏玩法(游戏玩法是SKScene),然后过渡动画运行和游戏开始。但是,当应用程序加载游戏玩法时,我想要一个旋转加载圈,而不是冻结应用程序。我怎样才能做到这一点?问我是否有不清楚的事情......
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
}
答案 0 :(得分:1)
以下是我在游戏中加载场景的方法。我在菜单场景中添加一个节点并对其应用动作以使其保持动画效果。然后我在后台线程初始化我的场景,这样主线程就不会被阻塞(记住主线程处理视觉渲染)。最后,在场景完成加载后,我将场景呈现在主线程上。以下是它的代码。
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))
})
})
}
答案 1 :(得分:0)
在后台线程( performSelectorInBackground )中启动加载代码,然后从主线程显示动画。当动画并行运行时,后台线程将执行其操作。
后台线程无法直接更新动画,但它可以定期调用主线程( performSelectorOnMainThread )并让主线程进行更新。
当后台线程完成后,调用一个mainthread函数( performSelectorOnMainThread ),告诉它停止动画并继续下一个场景。
类似的问题可能会有所帮助: updating UIProgressBar progress during loop