swift:从控制器访问正在使用的场景变量

时间:2014-08-28 10:26:05

标签: ios swift sprite-kit uipangesturerecognizer skspritenode

我正在做一个游戏。游戏的代码几乎完全在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好的时候,我有问题弄清楚为什么位置不正确。

1 个答案:

答案 0 :(得分:1)

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

旁注:您曾提到尝试将其存储在评论中的NSUserDefaults中。这不仅不起作用,而且这不是NSUserDefaults的用途。 NSUserDefaults专为简单的偏好而设计,而不是其他。您可以存储他们用于高分的姓氏,或者他们当前所处的级别,但通常不会比那些复杂得多。

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

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