我正在玩游戏。游戏的代码几乎完全在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().rotateTommyLeft()时,您正在创建PlayScene的新实例,而不访问游戏中当前正在运行的playScene。因此,您需要将playScene存储在某个位置,以便可以访问它。由于要在playScene中创建gameScene,因此GameScene类是放置playScene添加属性的好地方。

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

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

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

关于ios - swift:从 Controller 访问正在使用的场景变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25546504/

10-12 00:04