【问题标题】:Passing dynamic Int variable from one class to another class in Swift在 Swift 中将动态 Int 变量从一个类传递到另一个类
【发布时间】:2016-03-01 15:58:38
【问题描述】:

我是 swift 2 的新手,我被困在将变量从一个类传递到另一个类的过程中。

我有一个类“GameScene”,我有一个公共变量score,它在更新函数中不断更新。我想在两个节点相互碰撞时发送 score 值。一旦它发生碰撞,我会使用“mainview .presentScene(gameoverScene)”语法转到另一个场景。我想要gameoverscene中的更新分数。

我尝试在 gameoverscene 中使用“private let _gameScene = GameScene()”并使用“finalscore.text = String(_gameScene.finalScore)”将其传递给标签我得到的变量是我在开头声明的 O 但不是更新的分数。请帮助我找出解决方案。

【问题讨论】:

    标签: swift variables dynamic sprite-kit


    【解决方案1】:

    我使用NSUserDefaults 来处理这个问题。 所以,在 GameScene 声明类 GameScene 之后(而不是在任何函数中)我使用了

    var score = Int()
    var defaults = NSUserDefaults.standardUserDefaults()
    

    然后在同一个类的didMoveToView(view: SKView)函数中,我用了

    defaults.setInteger(0, forKey:"score")
    

    因此,每当出现GameScene 时,当前分数都会在您开始游戏之前重置为 0。 然后在你的碰撞函数中,在GameOver场景即将呈现之前(但仍在GameScene类中),你使用(在你的分数增加或减少之后)

    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" 总是有一些整数值,我们可以无错误地检索该值。

    希望有帮助:)

    【讨论】:

      【解决方案2】:

      如果您的 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")
      

      请注意,这种方式将值存储在持久存储中,并且 当您重新启动应用程序时,该值仍然可用。

      【讨论】:

      • 我在更新方法中增加分数。 score = score+1 在 GameScene 中说例如我从这个场景转移到 GameOverScene 更新中的分数在 GameScene 中的值为 50。我想要 GameOverScene 类中的 50 个。
      • @user3056032:了解,请查看我添加到答案中的更新。
      • 这个答案的价值,对我来说......是无价的。谢谢:stackoverflow.com/questions/40015729/…
      猜你喜欢
      • 2016-11-29
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多