使用Sprite Kit和Swift从另一个场景影响一个孩子

我试图教自己的Sprite Kit和Swift。 我想要做的是从ArcheryScene.sks文件访问一个子节点,并从ArcheryScene.swift文件中影响该子节点。 例如:在我的ArcheryScene.swift文件中,我添加了这一行代码: let scene = SKScene(fileNamed: "ArcheryScene") 。 这编译罚款,当我说println(scene) ,它正确打印我想要打印的场景,这就是我知道ArcheryScene.sks是真正在我的scenevariables。 在此之后,我通过添加以下代码行来访问该场景中的一个孩子: let ballChild = scene.childNodeWithName("Ball") 。 当我使用println(ballChild) ,它打印正确的孩子,让我知道variables确实包含在ArcheryScene.sks中的Ball子。 现在我的问题…

为什么我不能在我的ArcheryScene.swift文件中这样说:

 ballChild?.physicsBody?.affectedByGravity = false 

要么

 ballChild?.position.x = self.frame.size.width / 2 

要么

 let move = SKAction.moveByX(40, y: 0, duration: 5.0) ballChild?.runAction(move) 

所有这些代码都可以毫无错误地进行编译,但是当我运行游戏时,Ball并没有受到任何影响。 此外,如果我运行ballChild?.position.x = self.frame.size.width / 2 ,然后打印ballChild位置,它将显示为x:512,这应该是,但仍然当我运行游戏中,Ball不受影响。 这真是令我困惑,我只想弄清楚发生了什么。 任何build议,将不胜感激,谢谢。

这里是我的ArcherySceneSKS.sks文件和我的ArcheryScene.swift文件的截图,让您更好的理解。注意当我说<code> println(ballChild)</ code>时,它会正确地打印它。

如果你看一下Class ArcheryScene的定义,你会发现它是SKScene一个子类 – 所以你所编写的类已经是你的场景了。 项目中的UIViewController子类已经加载了ArcheryScene.sks并将其与ArcheryScene一个实例ArcheryScene

当你后来说let scene=SKScene(fileName:"ArcheryScene.sks")你实际上是在创build一个没有呈现在你的SKView中的场景的新实例。 然后在场景中修改球,但没有任何反应,因为这不是可见的球。

相反,你应该说

 let ballChild=self.childNodeWithName("Ball") if (ballChild? != nil) { let move=SKAction.moveByX(50 y:10 duration:10.0) ballChild!.runAction(move) } 

当你写下你的下面一行:

 let scene = SKScene(fileNamed: "ArcherySceneSKS") 

你正在创造一个新的场景。 所以你正在访问的ballChild是另外一个(不是你self (ArcheryScene ))。

如果你的ArcheryScene类被正确实例化了,你能不能像这样进行访问?

 let ballChild = self.childNodeWithName("Ball") 

让我知道是否有帮助。