使用 Sprite Kit 和 Swift 从另一个场景影响 Child
Affecting a Child From Another Scene Using Sprite Kit and Swift
我正在尝试自学 Sprite Kit 和 Swift。我想要做的是从 ArcheryScene.sks 文件访问 child 节点并影响 ArcheryScene.swift 文件中的 child。例如:在我的 ArcheryScene.swift 文件中,我添加了这行代码:let scene = SKScene(fileNamed: "ArcheryScene")
。
这编译得很好,当我说 println(scene)
时,它正确地打印了我想要它打印的场景,这就是我知道 ArcheryScene.sks 确实在我的 scene
变量中的方式。在此之后,我通过添加以下代码行从该场景访问 child:let ballChild = scene.childNodeWithName("Ball")
。当我使用 println(ballChild)
时,它会打印出正确的 child,让我知道该变量确实包含 ArcheryScene.sks 中的 Ball child。现在我的问题...
为什么我不能在我的 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,这是应该的,但是当我 运行 游戏时,球不受影响。这真的让我感到困惑,我只想弄清楚发生了什么。如有任何建议,我们将不胜感激。
如果您查看 Class ArcheryScene
的定义,您会发现它是 SKScene
的子 class - 因此您正在编码的 class 是 已经你的场景。您项目中的 UIViewController
subclass 已加载 ArcheryScene.sks
并将其与 ArcheryScene
.
的实例相关联
当您随后说 let scene=SKScene(fileName:"ArcheryScene.sks")
时,您实际上是在创建一个新的场景实例,该实例并未呈现在您的 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 class))。
如果你 ArcheryScene
class 被正确实例化,你不能像这样访问球吗?
let ballChild = self.childNodeWithName("Ball")
如果有帮助请告诉我。
我正在尝试自学 Sprite Kit 和 Swift。我想要做的是从 ArcheryScene.sks 文件访问 child 节点并影响 ArcheryScene.swift 文件中的 child。例如:在我的 ArcheryScene.swift 文件中,我添加了这行代码:let scene = SKScene(fileNamed: "ArcheryScene")
。
这编译得很好,当我说 println(scene)
时,它正确地打印了我想要它打印的场景,这就是我知道 ArcheryScene.sks 确实在我的 scene
变量中的方式。在此之后,我通过添加以下代码行从该场景访问 child:let ballChild = scene.childNodeWithName("Ball")
。当我使用 println(ballChild)
时,它会打印出正确的 child,让我知道该变量确实包含 ArcheryScene.sks 中的 Ball child。现在我的问题...
为什么我不能在我的 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,这是应该的,但是当我 运行 游戏时,球不受影响。这真的让我感到困惑,我只想弄清楚发生了什么。如有任何建议,我们将不胜感激。
如果您查看 Class ArcheryScene
的定义,您会发现它是 SKScene
的子 class - 因此您正在编码的 class 是 已经你的场景。您项目中的 UIViewController
subclass 已加载 ArcheryScene.sks
并将其与 ArcheryScene
.
当您随后说 let scene=SKScene(fileName:"ArcheryScene.sks")
时,您实际上是在创建一个新的场景实例,该实例并未呈现在您的 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 class))。
如果你 ArcheryScene
class 被正确实例化,你不能像这样访问球吗?
let ballChild = self.childNodeWithName("Ball")
如果有帮助请告诉我。