将动态 Int 变量从一个 class 传递到 Swift 中的另一个 class
Passing dynamic Int variable from one class to another class in Swift
我是 swift 2 的新手,我在将变量从一个 class 传递给另一个时遇到了困难。
我有一个 class "GameScene" 我有一个 public 变量 score 并且它在更新功能中不断更新。我想在两个节点相互碰撞时发送 score 值。一旦它发生碰撞,我就会使用 "mainview .presentScene(gameoverScene)" 语法转到另一个场景。我想要 gameoverscene 中的更新分数。
我尝试在 gameoverscene 中使用“private let _gameScene = GameScene()”并使用“finalscore.text = String( _gameScene.finalScore)" 我得到的变量是我在开头声明的 O 而不是更新的分数。请帮我找出解决方案。
如果您的 GameScene
有一个 score
属性 声明如下
class GameScene: SKScene {
var score = 0
}
然后从您游戏的任何节点(已添加到主场景)您可以使用 scene
属性 检索您的场景。所以你可以做类似的事情。
class MyNode: SKNode {
func foo() {
guard let gameScene = self.scene as? GameScene else {
fatalError("This node does not belong to a GameScene")
}
gameScene.score = 123
}
}
更新
根据你的评论,我了解到你想在多个场景中共享 score
值。有几种方法可以实现这一点。以下是最简单的方法之一。
节省
NSUserDefaults.standardUserDefaults().setInteger(123, forKey: "score")
阅读
let score = NSUserDefaults.standardUserDefaults().integerForKey("score")
Please note that this way the value is stored on persistent storage and
when you restart the app the value is still available.
我用 NSUserDefaults
来处理这个问题。
因此,在 class GameScene
声明之后的 GameScene
中(而不是在任何函数中)我使用了
var score = Int()
var defaults = NSUserDefaults.standardUserDefaults()
然后在同一个class中的didMoveToView(view: SKView)
函数中,我用了
defaults.setInteger(0, forKey:"score")
因此,每当出现 GameScene
时,当前分数会在您开始游戏前重置为 0。
然后在你的碰撞函数中,在GameOver
场景即将呈现之前(但仍在GameScene
class),你使用(在你的分数增加或减少之后)
defaults.setInteger(score, forKey:"score")
这会将当前 score
设置为 NSUserDefaults
中的键 "score"
。
最后,在GameOver
场景中,在出示乐谱之前,你可以说
let scoreFromGameScene = NSUserDefaults.standardUserDefaults().integerForKey("score")
label.text = "\(scoreFromGameScene)" //Or whatever you use to present the score
这将确保您从 GameScene
获得当前分数,以便您可以在 GameOver
场景中使用它。由于键 "score"
将始终具有一些整数值,因此我们可以无误地检索该值。
希望对您有所帮助:)
我是 swift 2 的新手,我在将变量从一个 class 传递给另一个时遇到了困难。
我有一个 class "GameScene" 我有一个 public 变量 score 并且它在更新功能中不断更新。我想在两个节点相互碰撞时发送 score 值。一旦它发生碰撞,我就会使用 "mainview .presentScene(gameoverScene)" 语法转到另一个场景。我想要 gameoverscene 中的更新分数。
我尝试在 gameoverscene 中使用“private let _gameScene = GameScene()”并使用“finalscore.text = String( _gameScene.finalScore)" 我得到的变量是我在开头声明的 O 而不是更新的分数。请帮我找出解决方案。
如果您的 GameScene
有一个 score
属性 声明如下
class GameScene: SKScene {
var score = 0
}
然后从您游戏的任何节点(已添加到主场景)您可以使用 scene
属性 检索您的场景。所以你可以做类似的事情。
class MyNode: SKNode {
func foo() {
guard let gameScene = self.scene as? GameScene else {
fatalError("This node does not belong to a GameScene")
}
gameScene.score = 123
}
}
更新
根据你的评论,我了解到你想在多个场景中共享 score
值。有几种方法可以实现这一点。以下是最简单的方法之一。
节省
NSUserDefaults.standardUserDefaults().setInteger(123, forKey: "score")
阅读
let score = NSUserDefaults.standardUserDefaults().integerForKey("score")
Please note that this way the value is stored on persistent storage and when you restart the app the value is still available.
我用 NSUserDefaults
来处理这个问题。
因此,在 class GameScene
声明之后的 GameScene
中(而不是在任何函数中)我使用了
var score = Int()
var defaults = NSUserDefaults.standardUserDefaults()
然后在同一个class中的didMoveToView(view: SKView)
函数中,我用了
defaults.setInteger(0, forKey:"score")
因此,每当出现 GameScene
时,当前分数会在您开始游戏前重置为 0。
然后在你的碰撞函数中,在GameOver
场景即将呈现之前(但仍在GameScene
class),你使用(在你的分数增加或减少之后)
defaults.setInteger(score, forKey:"score")
这会将当前 score
设置为 NSUserDefaults
中的键 "score"
。
最后,在GameOver
场景中,在出示乐谱之前,你可以说
let scoreFromGameScene = NSUserDefaults.standardUserDefaults().integerForKey("score")
label.text = "\(scoreFromGameScene)" //Or whatever you use to present the score
这将确保您从 GameScene
获得当前分数,以便您可以在 GameOver
场景中使用它。由于键 "score"
将始终具有一些整数值,因此我们可以无误地检索该值。
希望对您有所帮助:)