如何从 Swift SpriteKit 中的另一个 SKScene 访问变量

Posted

技术标签:

【中文标题】如何从 Swift SpriteKit 中的另一个 SKScene 访问变量【英文标题】:How to access variables from another SKScene in Swift SpriteKit 【发布时间】:2015-07-06 00:57:09 【问题描述】:

我在访问其他类的变量时遇到了问题。这是我的代码。 这是我试图访问变量“lastSelection”的类它也是第一个调用查看的SKScene。

class FighterPlaneselect : SKScene 
    var lastSelection:String = ""

    override func didMoveToView(view: SKView)  
        if(true) 
            lastSelection = "Mustang"
        
    

//Here is the second class called "GameField"
class GameField : SKScene 
    var FighterPlane : FighterPlaneSelect!
    override func didMoveToView(view: SKView) 
        FighterPlane = FighterPlaneSelect()
        print(FighterPlane.lastSelection)
    

每当它打印出来时,它都会打印“”。它应该打印“Mustang”。

【问题讨论】:

【参考方案1】:

在这一行:

FighterPlane = FighterPlaneSelect()

您实例化该类的 SKScene。问题是,它从未显示,因此方法:func didMoveToView(view: SKView) 从未被调用。

你需要的是对另一个场景的引用。

一种可能性是执行以下操作:

class FighterPlaneSelect : SKScene 
var lastSelection:String = ""

override func didMoveToView(view: SKView)  
        if(true) 
            lastSelection = "Mustang"
        
    


//Here is the second class called "GameField"
class GameField : SKScene 
    var fighterPlane : FighterPlaneSelect!
    override func didMoveToView(view: SKView) 
        print(FighterPlane.lastSelection)
    


//Here is in the GameScene
let fighterPlaneSelect = FighterPlaneSelect
//show the scene to make it move to view
//then assign the variable inside the gameField object
let gameField = GameField()
gameField.fighterPlane = fighterPlaneSelect

【讨论】:

首先调用 FighterPlaneSelect 视图,然后调用 GameField 视图 它们是从哪个类调用的? 这实际上不是我的完整代码,因为我不想把它放出来。 FighterPlaneSelect 类是第一个视图。它被称为 GameScene,但我想出了如何更改它。所以它是默认视图 如果没有实际代码,我无能为力。也就是说,由于您的 GameScene 对象包含对 fighterPlaneSelect 实例化对象的引用,因此它可以将其传递给任何人。如果您从您的 GameScene 实例化您的 gameField,那么您可以执行我在修改后的答案中发布的内容。本质上,您实例化了您的 GameField 对象,该对象包含一个类型为 FighterPlaneSelect 的变量,该变量为 nil。然后将该对象传递给实例化的 FighterPlaneSelect 对象的引用。希望这是有道理的..【参考方案2】:

您可以在场景的 init 方法中初始化该变量:

  class FighterPlaneselect : SKScene 
    var lastSelection:String = ""

    override  init(size: CGSize)

        super.init(size: size)

         lastSelection = "Mustang"

    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    override func didMoveToView(view: SKView)  

    

然后像以前一样使用它:

class GameField : SKScene 
    var FighterPlane : FighterPlaneselect!

    override func didMoveToView(view: SKView) 


        FighterPlane = FighterPlaneselect(size: self.size)

        println(FighterPlane.lastSelection)
    

【讨论】:

【参考方案3】:

非常简单!只需在类外声明 lastSelection !

class FighterPlaneselect : SKScene 
var lastSelection:String = "" //Declared in the class


var lastSelection:String = "" //Declared outside the class
class FighterPlaneselect : SKScene 


【讨论】:

以上是关于如何从 Swift SpriteKit 中的另一个 SKScene 访问变量的主要内容,如果未能解决你的问题,请参考以下文章

Swift,SpriteKit:释放游戏场景并重新分配新场景

如何将数据从 Playground 页面传递到 Swift Playgrounds 中的另一个 Playground 页面?

如何使用 Swift 正确切换 SpriteKit 中的 SKScene?

如何将SpriteKit中的单个游戏场景添加到普通的单视图Swift应用程序中

从Swift中的另一个类刷新UITableView

从Swift中的另一个ViewController访问rightBarButton函数