我正在制作游戏。游戏的代码几乎完全在PlayScene.swift文件中。但是,由于我需要识别平移手势,因此必须将UIPanGestureRecognizer添加到我的ViewController.swift中。当玩家拖动屏幕时,我想旋转在PlayScene.swift中声明和使用的SpriteNode。这个spriteNode的名称是Tommy,但是当我从ViewController(这是我在PlayScene.swift中的一个自定义函数)中执行PlayScene().rotateTommyLeft()
时,函数rotateTommyLeft被调用,但它不会旋转当前正在运行的同一个sprite 。它创建一个类PlayScene的新实例,创建新的SpriteNode tommy,然后旋转那个。swift:从控制器访问正在使用的场景变量
如何从当前正在运行的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)
现在令人吃惊的一部分出现,当我试图获得两个变量属于PlayScene类,来自ViewController类。
当我写这篇文章的视图控制器类
var rotation = GameScene().getStoredPlayScene().tommy.zRotation
我获得正确的zRotation。 但是,当我在相同的ViewController类var position = GameScene().getStoredPlayScene().getPos()
中编写该数据时,数据不正确。它表示位置是(0,0)。
我有问题搞清楚为什么位置不正确,而zRotation是好的。
何时/在哪里创建正在使用的PlayScene实例?您需要存储对该实例的引用,并使用该引用来调用'playScene.rotateTommyLeft()'。 – 2014-08-28 14:59:41
谢谢。我找到了代码。它正在被称为GameScene的前一场景中创建。我究竟如何存储它,以便我可以从控制器访问它?我试图将它存储在NSUserDefaults中,但我无法检索它。有没有其他的变量,你推荐存储它? – Sam 2014-08-28 16:26:14
_不要使用NSUserDefaults,这不是它的目的。没有看到你的代码和/或知道你的项目是如何布置的,很难准确地说出你应该做什么。但是,一般来说,这听起来像'PlayScene'应该是一个[属性](https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/ 'GameScene'上的doc/uid/TP40014097-CH14-XID_368),它应该是视图控制器上的一个属性。然后你可以通过'self.gameScene.playScene'这样的东西从你的视图控制器访问'PlayScene'。 – 2014-08-28 19:48:39