правильный способ передать переменную из GameController: UIViewController в SKScene в быстрой SKKit? - PullRequest
0 голосов
/ 13 мая 2019

Как передать переменную из GameController: UIController в SKScene в быстром режиме?

Выход:

[MC] Reading from private effective user settings.
Simulator user has requested new graphics quality: 100
scene did load
userData nil
userData nil
userData nil
try to set username
setting username
userData nil
playername in scene nil
userdata in scene nil
userdata in scene nil
userData nil
playername Optional("jsky")
playername in controller Optional(jsky)
scene did load
userData nil
userData nil
userData nil
try to set username
setting username
userData nil
playername in scene nil
userdata in scene nil
userdata in scene nil
userData nil
controller: the scenes root node: Optional(<SKScene> name:'(null)' frame:{{-375, -667}, {750, 1334}} anchor:{0.5, 0.5})
scene called didMove
userData nil

Класс GameViewController

class GameViewController: UIViewController {

    var playername:String?
    var scene: GKScene?

    override func viewDidLoad() {
            super.viewDidLoad()

            if let view = self.view as! SKView? {

            if let scene = GKScene(fileNamed: "GameScene") {

                // Get the SKScene from the loaded GKScene
                if let sceneNode = scene.rootNode as! GameScene? {

                    // Copy gameplay related content over to the scene
                    sceneNode.entities = scene.entities
                    sceneNode.graphs = scene.graphs


                    print("playername", self.playername)
                    var userDataDict: NSMutableDictionary = [:] //init dict,  nil by default
                    sceneNode.userData = userDataDict
                    sceneNode.userData?.setObject(self.playername!, forKey: "playername" as NSCopying)
                    print("playername in controller", sceneNode.userData?["playername"])

                    // Set the scale mode to scale to fit the window
                    sceneNode.scaleMode = .aspectFill
                    let scene = GKScene(fileNamed: "GameScene", rootNode: sceneNode)
                    self.scene = scene

                    // Present the scene
    //                if let view = self.view as! SKView? {
                    print("controller: the scenes root node:", self.scene!.rootNode)
                        view.presentScene(self.scene?.rootNode as! SKScene)
    //                    view.isAsynchronous=false
                        view.ignoresSiblingOrder = true
                        view.showsFPS = true
                        view.showsNodeCount = true
    //                    view.scene.setUsername()
    //                    view.scene?.didMove(to: view)
                    }
                }
            }
        }
}

Класс GameScene

import SpriteKit
import GameplayKit

    class GameScene: SKScene {

        var entities = [GKEntity]()
        var graphs = [String : GKGraph]()
        var playername: String?

        private var lastUpdateTime : TimeInterval = 0
        private var label : SKLabelNode?
        private var usernamelabel : SKLabelNode?
        private var spinnyNode : SKShapeNode?



        override func sceneDidLoad(){
            print("scene did load")
            print("userData",self.userData)
            print("userData",self.userData)

            self.lastUpdateTime = 0


            // Get label node from scene and store it for use later
            self.label = self.childNode(withName: "//helloLabel") as? SKLabelNode
            if let label = self.label {
                label.alpha = 0.0
                label.run(SKAction.fadeIn(withDuration: 2.0))
                label.text = "test"
            }

            // Create shape node to use during mouse interaction
            let w = (self.size.width + self.size.height) * 0.05
            self.spinnyNode = SKShapeNode.init(rectOf: CGSize.init(width: w, height: w), cornerRadius: w * 0.3)

            if let spinnyNode = self.spinnyNode {
                spinnyNode.lineWidth = 2.5

                spinnyNode.run(SKAction.repeatForever(SKAction.rotate(byAngle: CGFloat(Double.pi), duration: 1)))
                spinnyNode.run(SKAction.sequence([SKAction.wait(forDuration: 0.5),
                                                  SKAction.fadeOut(withDuration: 0.5),
                                                  SKAction.removeFromParent()]))
            }

            print("userData",userData)
            do{
            print("try to set username")
            try
                setUsername()
            }
            catch{
                print("no username set")
            }

        }

        func setUsername() throws {

            print("setting username")
            print("userData",self.userData)

            self.usernamelabel = self.childNode(withName: "//usernamelabel") as? SKLabelNode
            do{


            if let usernamelabel = self.usernamelabel{
            usernamelabel.alpha = 0.0
            usernamelabel.run(SKAction.fadeIn(withDuration: 2.0))

                print("playername in scene", self.playername)
                print("userdata in scene", self.parent?.userData)
                print("userdata in scene", self.userData)
            }
            print("userData",self.userData)
            if let playername: String = userData?.value(forKey:"playername") as? String{
            print("playername from userdata is", playername)
            usernamelabel?.text=playername

            }

            }catch {

                throw GameError.PlayerNameNotFound
            }
        }

        override func didMove(to view: SKView){
            print("scene called didMove")
            print(self.userData)
            if let playername = self.userData?.value(forKey: "playername") {
                print("gameInfo is :\(playername)")
                do{ try self.setUsername()}
                catch{
    //                throw.GameError.PlayerNameNotFound
                    print("couldnt set username")
                }
            }
        }
    }
...