我正在玩游戏。游戏的代码几乎完全在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/