在场景之间传递时加载动画

时间:2015-06-27 16:22:18

标签: ios swift sprite-kit

我正在使用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
}

2 个答案:

答案 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