【问题标题】:Affecting a Child From Another Scene Using Sprite Kit and Swift使用 Sprite Kit 和 Swift 从另一个场景影响孩子
【发布时间】:2015-03-04 23:35:38
【问题描述】:

我正在尝试自学 Sprite Kit 和 Swift。我要做的是从 ArcheryScene.sks 文件中访问一个子节点,并从 ArcheryScene.swift 文件中影响该子节点。例如:在我的 ArcheryScene.swift 文件中,我添加了这行代码:let scene = SKScene(fileNamed: "ArcheryScene")。 这编译得很好,当我说println(scene) 时,它会正确打印我想要打印的场景,这就是我知道 ArcheryScene.sks 真正在我的scene 变量中的方式。在此之后,我通过添加以下代码行来访问该场景中的一个孩子:let ballChild = scene.childNodeWithName("Ball")。当我使用println(ballChild) 时,它会打印出正确的孩子,让我知道该变量确实包含 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 不受影响。这对我来说真的很困惑,我只想弄清楚发生了什么。任何建议将不胜感激,谢谢。

【问题讨论】:

  • 老实说,目前还不清楚您如何加载所有内容。如果您添加 5 或 10 行代码且解释较少,我认为会有所帮助。但是,作为一般规则,最好从另一个类调用方法,而不是更改变量。并尝试看看它是不是一个愚蠢的错误,例如物理问题,在同一个班级进行简单的测试。让球移动后,在方法中使用代码,然后从另一个类调用此方法。
  • 提供更多的代码,更少的文字
  • 您是否将physicsBody 附加到ballChild?如果没有,这毫无意义:ballChild?.physicsBody?.affectedByGravity = false
  • 是的,ArcheryScene.sks 文件中有一个下拉栏设置,让我可以选择将物理体设置为圆形
  • 你是否真的在屏幕上显示playScene(你有没有用它打电话给presentScene()

标签: ios swift sprite-kit skspritenode skscene


【解决方案1】:

如果您查看 Class ArcheryScene 的定义,您会发现它是 SKScene 的子类 - 所以您正在编码的类已经您的场景。您项目中的UIViewController 子类已加载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)
}

【讨论】:

  • 感谢您的反馈,这解决了我的问题!
  • 另外,您看到 Ball 是父级的子级:“环境”,如果我想影响环境本身怎么办?例如:Enviroment!.runAction(move)
  • Ball 是 ArcheryScene SKScene 的子对象,在本例中为 self
  • 如果我说self!.runAction(move) 什么都不会发生
  • 没错——你不能移动场景——至少不能通过动作来移动。您可以更改持有场景的 SKView 的框架。如果要为背景设置动画,则将背景添加为注释并移动它。场景就像你的电视屏幕。当电影中发生某些事情时,您的电视不会在墙上移动。
【解决方案2】:

当您编写以下行时:

let scene = SKScene(fileNamed: "ArcherySceneSKS")

您正在创建一个新场景。因此,您正在访问的 ballChild 是另一个(不是您的 self (ArcheryScene class) 中的那个)。

如果您的ArcheryScene 类已正确实例化,您就不能像这样访问球吗?

let ballChild = self.childNodeWithName("Ball")

如果有帮助,请告诉我。

【讨论】:

  • 另外,您看到 Ball 是父级的子级:“环境”,如果我想影响环境本身怎么办?例如:Enviroment!.runAction(move)
  • 我现在不能尝试,但你可以做与球相同的事情(给它一个名字并访问它)或者一旦你有球访问它的父属性@ 987654327@.
  • 我试过这是说:“动画 SKScene 的位置没有效果”我也试过:self?.runAction(move) 我得到了同样的信息
  • 嗯,这个错误已经足够解释了,不是吗?您正在尝试在场景而不是节点上运行动作。例如,让你的球附加到另一个节点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
相关资源
最近更新 更多