Ios 使用Sprite工具包和Swift从另一个场景影响儿童

Ios 使用Sprite工具包和Swift从另一个场景影响儿童,ios,swift,sprite-kit,skspritenode,skscene,Ios,Swift,Sprite Kit,Skspritenode,Skscene,我试着自学雪碧套装和斯威夫特。我试图做的是从ArcheryScene.sks文件访问一个子节点,并从ArcheryScene.swift文件影响该子节点。例如:在我的ArcheryScene.swift文件中,我添加了以下代码行:let scene=SKScene(文件名为:“ArcheryScene”)。 这编译得很好,当我说println(scene)时,它正确地打印了我希望它打印的场景,这就是我如何知道ArcheryScene.sks确实在我的scene变量中。在这之后,我通过添加以下代码

我试着自学雪碧套装和斯威夫特。我试图做的是从ArcheryScene.sks文件访问一个子节点,并从ArcheryScene.swift文件影响该子节点。例如:在我的ArcheryScene.swift文件中,我添加了以下代码行:
let scene=SKScene(文件名为:“ArcheryScene”)
。 这编译得很好,当我说
println(scene)
时,它正确地打印了我希望它打印的场景,这就是我如何知道ArcheryScene.sks确实在我的
scene
变量中。在这之后,我通过添加以下代码行从该场景访问一个孩子:
让ballChild=scene.childNodeWithName(“Ball”)
。当我使用
println(ballChild)
时,它会打印正确的子项,让我知道变量确实包含ArcheryScene.sks中的Ball子项。现在来谈谈我的问题

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

ballChild?.physicsBody?.affectedByGravity = false

所有这些代码将编译无误,但当我运行游戏时,球根本不受影响。此外,如果我运行
ballChild?.position.x=self.frame.size.width/2
,然后打印ballChild位置,它将显示为x:512,这是它应该显示的位置,但当我运行游戏时,球不会受到影响。这让我很困惑,我只是想弄清楚到底发生了什么。如果您有任何建议,我们将不胜感激,谢谢


println(ballChild)它可以正确打印。“>

如果您查看
类ArcheryScene
的定义,您将看到它是
SKScene
的子类-因此您正在编码的类已经是您的场景了。项目中的
UIViewController
子类已加载
ArcheryScene.sks
,并将其与
ArcheryScene
的实例关联

当您随后说
let scene=SKScene(文件名:“ArcheryScene.sks”)
时,实际上您正在创建一个场景的新实例,该实例未显示在您的SKView中。然后修改该场景中的球,但不会发生任何事情,因为这不是可见的球

相反,你应该说

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

如果您查看
类ArcheryScene
的定义,您将看到它是
SKScene
的一个子类,因此您正在编码的类已经是您的场景了。项目中的
UIViewController
子类已加载
ArcheryScene.sks
,并将其与
ArcheryScene
的实例关联

当您随后说
let scene=SKScene(文件名:“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类)中的一个)

如果您
ArcheryScene
类被正确实例化,您不能这样做来访问球吗

let ballChild = self.childNodeWithName("Ball")

如果有帮助,请告诉我。

当您写下以下行时:

let scene = SKScene(fileNamed: "ArcherySceneSKS")
您正在创建一个新场景。因此,您正在访问的
ballChild
是另一个(而不是
self
(ArcheryScene类)中的一个)

如果您
ArcheryScene
类被正确实例化,您不能这样做来访问球吗

let ballChild = self.childNodeWithName("Ball")


如果有帮助,请告诉我。

老实说,不清楚如何加载所有内容。如果你添加5行或10行代码,解释更少,我认为这会有所帮助。但是,一般来说,从另一个类调用方法比更改变量要好。试着在同一堂课上做一个简单的测试,看看这不是一个愚蠢的错误,比如物理问题。使球移动后,使用方法中的代码,并从另一个类调用此方法。提供更多代码,减少单词。是否将
physicsBody
附加到
ballChild
?如果没有,这是毫无意义的:
ballChild?.physicsBody?.affectedByGravity=false
是的,从ArcheryScene.sks文件中有一个下拉栏设置,让我可以选择将物理体设置为一个圆圈,您实际在屏幕上呈现
playsecene
(您是否调用了
presentScene())
老实说,现在还不清楚如何加载所有内容。如果添加5行或10行代码而不进行太多解释,这可能会有助于我的思考。但是,一般来说,最好从另一个类调用方法,而不是更改一个变量。通过在s中进行简单的测试,试着看看这是否是一个愚蠢的错误,例如物理问题ame类。一旦你使球移动,在一个方法中使用代码,并从另一个类调用此方法。提供更多代码,更少单词。你是否将
physicsBody
附加到
ballChild
?如果没有,这是毫无意义的:
ballChild?.physicsBody?.affectedByGravity=false
是的,从ArcheryScene.sks文件中有一个下拉栏设置,让我可以选择将物理体设置为一个圆圈。您实际在屏幕上呈现
playsecene
(您是否调用了
presentScene()
)感谢您的反馈这解决了我的问题!此外,您还可以看到球是父对象的子对象:“环境”,如果我想影响环境本身该怎么办?例如:
environment!.runAction(move)
Ball是
ArcheryScene
SKScene
,如果我说
self!.runAction(move),它就是
self
什么也没发生这是正确的-你不能移动场景-至少不能用动作。你可以更改保存场景的SKView的帧。如果你想设置背景动画,那么将背景添加为注释并移动。场景就像你的电视屏幕。当某个东西