2014-08-28 64 views
0

我正在制作游戏。游戏的代码几乎完全在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是好的。

+1

何时/在哪里创建正在使用的PlayScene实例?您需要存储对该实例的引用,并使用该引用来调用'playScene.rotateTommyLeft()'。 – 2014-08-28 14:59:41

+0

谢谢。我找到了代码。它正在被称为GameScene的前一场景中创建。我究竟如何存储它,以便我可以从控制器访问它?我试图将它存储在NSUserDefaults中,但我无法检索它。有没有其他的变量,你推荐存储它? – Sam 2014-08-28 16:26:14

+1

_不要使用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

回答

1

当您致电PlayScene().rotateTommyLeft()时,您将创建一个新实例PlayScene,并且不访问当前在您游戏中运行的playScene。所以,你需要在某个地方存储playScene,以便你可以访问它。由于您在gameScene内部创建了playScene,因此GameScene类是为playScene添加属性的好地方。

便笺:您提到了尝试将它存储在注释中的NSUserDefaults中。这不仅不起作用,但那不是NSUserDefaults的用处。 NSUserDefaults是为简单的喜好而设计的,没有其他的东西。你可能会存储他们用于获得高分的姓氏,或者他们目前所处的水平,但通常不会比这更复杂。

既然我们有一个playScene的地产gameScene,您需要能够从您的视图控制器访问它。要做到这一点,您需要能够从您的视图控制器访问gameScene。因此,就像您将playScene属性添加到gameScene一样,将gameScene属性添加到您的视图控制器。一旦到位并正确设置,您就可以访问您尝试拨打的原始方法:self.gameScene.playScene.rotateTommyLeft()

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

+0

谢谢。完美和详细的答案,解决了我的问题。 – Sam 2014-08-30 14:46:35

相关问题