Вызов функций между GameScene и GameViewController с использованием SKSprit - PullRequest
0 голосов
/ 06 августа 2020

Итак, я пишу программу быстро, и у меня возникли проблемы с пониманием правильного взаимодействия между GameScene и GameViewController:

В основном у меня есть 'savefiles', которые являются плистами, при загрузке с использованием функции "self.loadFromPlist ( fileName:) "загружаются путем очистки предыдущего массива узлов и отрисовки набора SKShapeNodes на основе атрибутов из элементов словаря загруженного файла Plist

Мне нужен файловый браузер, который я реализовал из Cocoapod (FileBrowser), который должен вызываться в «GameViewController»

Моя проблема такова:

При вызове моей функции 'loadFromPlist' изнутри 'viewDidLoad', как это (для инициализации проекта ) - функция работает, и игровая сцена отрисовывается:

override func viewDidLoad() {
    super.viewDidLoad()
    
    if let view = self.view as! SKView? {
        // Load the SKScene from 'GameScene.sks'
        if let scene = SKScene(fileNamed: "GameScene") {
            // Set the scale mode to scale to fit the window
            
            scene.scaleMode = .aspectFill
            
            // Present the scene
           view.presentScene(scene)
            
           let gameScene = scene as! GameScene
            
           gameScene.loadFromPlist(scoreFileName: gameScene.defaultScore)
           gameScene.gameViewControllerDelegate = self
        }
        view.ignoresSiblingOrder = true
        view.showsFPS = true
        view.showsNodeCount = true
    }
}

Когда я пытаюсь сделать то же самое в своей собственной функции в GameViewController (называемой view a GameviewDelete в GamScene), код выполняет строку, и я можете следовать за ним с помощью отладчика в функцию loadFromPlist в ga mescene, он выполняет for l oop рисование фигур et c, но просто ничего не делает.

func callloadplist() {
    
    var loadedfilename2:String!
    
    let file = FileBrowser()
    present(file, animated: true, completion: nil)
    
    if let scene = GameScene(size: view.frame.size) as? GameScene {

        var strippedfilename: String?

        file.didSelectFile = { (file: FBFile) -> Void in
            let loadedfilename = file.displayName

            scene.filebrowserselectedfilename = loadedfilename

            if let view = self.view as! SKView? {
                // Load the SKScene from 'GameScene.sks'
                if let myskscene = SKScene(fileNamed: "GameScene") {
                    // Set the scale mode to scale to fit the window

                    let gameScene = myskscene as! GameScene
                    let strippedfilename = String(loadedfilename.dropLast(6))

                    print(strippedfilename)
                    
                    gameScene.loadFromPlist(scoreFileName: "output")
                }
            }
        }
    }
}

Таким образом, вызов функции работает внутри viewDidLoad (), а также как self. loadFromPlist (fileName:) 'в GameScene.swift, но не может быть вызван из пользовательского метода / функции, созданного мной в GameViewControllers - Любая информация?

Спасибо

1 Ответ

0 голосов
/ 08 августа 2020

Итак, file.didSelectFile настраивает закрытие для ответа на событие выбранного файла. Затем выполнялась функция, вызываемая в другом экземпляре объекта GameScene.

Я смог уточнить свой вопрос и ответить на него здесь:

Swift - SKSprite Kit - Измените переменные Gamescene из закрытия FileBrowser

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...