我正在做一个游戏。游戏的代码几乎完全在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好的时候,我有问题弄清楚为什么位置不正确。
答案 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
的新实例。如果你改变它以使用我们上面创建的属性,它应该可以正常工作。