Переключение со сцены Spritekit обратно на раскадровку - PullRequest
0 голосов
/ 25 апреля 2019

Проще говоря, я хочу перейти от сцены спрайтекита к представлению на главной раскадровке. Быстро перейти от основной раскадровки к сцене спрайтекитов. Но я не могу понять, как вернуться к раскадровке. Спасибо за помощь. Приветствия.

1 Ответ

0 голосов
/ 25 апреля 2019

Начальный viewController: пустой viewController с кнопкой для представления GameViewController

GameViewController: типичный GameViewController из шаблона Sprite-набора "Hello World". (Это упрощенная версия двух скриптов, так как, конечно, у вас будет больше кода в вашем, однако, с целью поделиться тем, что я сделал, это проще)

Моя цель: я хотел представить первый viewController из моей игры SKScene с правильным освобождением моей сцены.

Описание: Для получения результата я расширил класс SKSceneDelegate, чтобы создать собственный протокол / делегат, который выполняет переход от GameViewController к первому начальному контроллеру (главное меню). Этот метод может быть распространен на другие viewControllers вашей игры. Этот делегат используется при возврате в главное меню. Обязательно поставьте эту функцию перед вызовом класса для вашего скрипта spritekit.

Два сценария показаны ниже. Надеюсь, это поможет всем, у кого был мой вопрос.

UIViewController:

import UIKit
import SpriteKit
class GameViewController: UIViewController,TransitionDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        if let view = self.view as! SKView? {
            if let scene = SKScene(fileNamed: "GameScene") {
                scene.scaleMode = .aspectFill
                scene.delegate = self as TransitionDelegate
                view.presentScene(scene)
            }
        view.ignoresSiblingOrder = true
        view.showsFPS = true
        view.showsNodeCount = true
    }
}
func returnToMainMenu(){
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    guard  let storyboard = appDelegate.window?.rootViewController?.storyboard else { return }
    if let vc = storyboard.instantiateInitialViewController() {
        print("go to main menu")
        self.present(vc, animated: true, completion: nil)
    }
  }
}

Сценарий игры:

import SpriteKit
protocol TransitionDelegate: SKSceneDelegate {
    func returnToMainMenu()
}
class GameScene: SKScene {
   override func didMove(to view: SKView) {
        self.run(SKAction.wait(forDuration: 2),completion:{[unowned self] in
            guard let delegate = self.delegate else { return }
            self.view?.presentScene(nil)
            (delegate as! TransitionDelegate).returnToMainMenu()
        })
    }
     deinit {
        print("\n THE SCENE \((type(of: self))) WAS REMOVED FROM MEMORY (DEINIT) \n")
    }
}
...