Загрузка анимации при переходе между сценами

Я делаю игру для iOS, используя Swift. В меню (Menu - 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 ответа

Решение

Вот как я справляюсь с загрузкой сцены в моей игре. Я добавляю узел в сцену меню и применяю к нему действие, чтобы сохранить его анимацию. Затем я инициализирую сцену в фоновом потоке, чтобы основной поток не блокировался (помните, что основной поток обрабатывает визуальный рендеринг). Наконец, после завершения загрузки сцены, я представляю сцену обратно в основной поток. Вот код для этого ниже.

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))
        })

    })
}

Запустите код загрузки в фоновом потоке (executeSelectorInBackground), затем отобразите анимацию из основного потока. Фоновый поток выполнит свою работу, пока анимация работает параллельно.

Фоновый поток не может напрямую обновить анимацию, но он может периодически вызывать основной поток (executeSelectorOnMainThread) и заставлять основной поток обновлять.

Когда фоновый поток завершен, вызовите функцию mainthread (executeSelectorOnMainThread), которая сообщает ему остановить анимацию и перейти к следующей сцене.

Подобные вопросы, которые могут быть полезны: обновление прогресса UIProgressBar во время цикла

Другие вопросы по тегам