【问题标题】:swift: Access scene variable in use from controllerswift:从控制器访问正在使用的场景变量
【发布时间】:2014-08-28 10:26:05
【问题描述】:

我正在开发一款游戏。游戏的代码几乎完全在 PlayScene.swift 文件中。但是,由于我需要识别平移手势,我不得不将 UIPanGestureRecognizer 放入我的 ViewController.swift 中。当玩家拖动屏幕时,我想旋转在 PlayScene.swift 中声明和使用的 SpriteNode。这个 spriteNode 的名称是 Tommy,但是当我从 ViewController(这是我在 PlayScene.swift 中的自定义函数)执行 PlayScene().rotateTommyLeft() 时,调用了函数 rotateTommyLeft,但它不会旋转同一个精灵目前正在运行。它创建一个 PlayScene 类的新实例,创建新的 SpriteNode tommy,然后旋转那个。

如何从当前运行的 PlaySceen 访问 SpriteNode tommy?

编辑:我正在发布部分代码,以便我们解决有关存储场景和在其他类之间传输它的问题。

在我的 GameScene 类的顶部,我声明了变量 storedPlayScene 来存储游戏发生的场景。

var storedPlayScene = PlayScene()

然后,我创建场景并在按下播放按钮时呈现它(也在 GameScene 类中)

var scene = PlayScene(size: self.size)
                let skView = self.view as SKView
                skView.ignoresSiblingOrder = true
                scene.scaleMode = .ResizeFill
                scene.size = skView.bounds.size
                scene.backgroundColor = UIColor(red: 106/255.0, green: 180/255.0, blue: 1.0, alpha: 1.0)

                storedPlayScene = scene

                skView.presentScene(scene)

现在,当我尝试从 ViewController 类中获取属于 PlayScene 类的两个变量时,出现了令人惊讶的部分。

当我在 ViewController 类中写这个时

var rotation = GameScene().getStoredPlayScene().tommy.zRotation 我得到了正确的 zRotation。 但是,当我在同一个 ViewController 类var position = GameScene().getStoredPlayScene().getPos() 中编写此代码时,数据不正确。它说位置是(0,0)。

我无法弄清楚为什么 zRotation 很好时位置不正确。

【问题讨论】:

  • 您何时/何地创建正在使用的PlayScene 实例?您需要存储对该实例的引用并使用该引用调用playScene.rotateTommyLeft()
  • 谢谢。我找到了代码。它是在名为 GameScene 的先前场景中创建的。我究竟如何存储它,以便我也可以从控制器访问它?我尝试将它存储在 NSUserDefaults 中,但我无法检索它。您是否建议将其存储在任何其他变量中?
  • 不要为此使用 NSUserDefaults,这不是它的用途。 没有看到你的代码和/或不知道你的项目是如何布局的,很难准确地说出你是什么应该做。但是,一般来说,听起来PlayScene 应该是GameScene 上的property,它应该是视图控制器上的一个属性。然后你可以从你的视图控制器访问PlayScene,比如self.gameScene.playScene
  • 好的,我创建了一个存储 PlayScene 类的变量,但我遇到了部分问题。你能看看编辑吗?
  • 几件事:1.它应该是var storedPlayScene: PlayScene!,当你使用... = PlayScene()时,你正在创建一个新实例,这不是你想要的。 2. var rotation = GameScene()... 正在创建GameScene 的新实例,这也不是您想要的。你应该在你的视图控制器中为你的GameScenestoredGameScene 或其他东西提供类似于storedPlayScene 的东西。

标签: ios swift sprite-kit uipangesturerecognizer skspritenode


【解决方案1】:

当您调用PlayScene().rotateTommyLeft() 时,您正在创建PlayScene 的新实例,而不是访问当前在您的游戏中运行的playScene。因此,您需要将playScene 存储在某处,以便您可以访问它。由于您在gameScene 中创建playScene,因此GameScene 类是为playScene 添加属性的好地方。

旁注:您提到尝试将其存储在 cmets 的 NSUserDefaults 中。这不仅行不通,而且这不是 NSUserDefaults 的用途。 NSUserDefaults 是为简单的偏好而设计的,仅此而已。您可以存储他们用于获得高分的姓氏,或者他们目前所处的级别,但通常不会存储比这更复杂的东西。

现在我们在gameScene 中有一个playScene 的属性,您需要能够从您的视图控制器访问它。为此,您需要能够从视图控制器访问gameScene。因此,就像您将 playScene 属性添加到 gameScene 一样,将 gameScene 属性添加到您的视图控制器。一旦到位并正确设置,您将能够访问您尝试调用的原始方法:self.gameScene.playScene.rotateTommyLeft()

Re:编辑中的旋转和位置。你在那里做同样的事情:你在每次调用时创建一个GameScene 的新实例。如果您将其更改为使用我们在上面创建的属性,它应该可以正常工作。

【讨论】:

  • 谢谢。完美而详细的答案解决了我的问题。
猜你喜欢
  • 2014-01-10
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多