使用Sprite Kit和Swift从另一个场景影响一个孩子
我试图教自己的Sprite Kit和Swift。 我想要做的是从ArcheryScene.sks文件访问一个子节点,并从ArcheryScene.swift文件中影响该子节点。 例如:在我的ArcheryScene.swift文件中,我添加了这一行代码: let scene = SKScene(fileNamed: "ArcheryScene")
。 这编译罚款,当我说println(scene)
,它正确打印我想要打印的场景,这就是我知道ArcheryScene.sks是真正在我的scene
variables。 在此之后,我通过添加以下代码行来访问该场景中的一个孩子: 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议,将不胜感激,谢谢。
如果你看一下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")
让我知道是否有帮助。