使用Swift在SpriteKit中导入外部节点

时间:2017-03-18 14:08:09

标签: swift xcode sprite-kit xcode8

我正在开发一款Breakout型游戏。我在不同的场景(PaddleScene.sks)中创建了paddle,因此我可以跨多个级别引用它。不知道是不是这样做了,还是新手。

我在GameScene.sks通过SKReferenceNode添加了paddle并在代码中引用了它:

paddle = self.childNode(withName: "//paddle") as! SKSpriteNode

这很有效,但问题是现在paddle.position.x给了我0,因为那是它在PaddleScene.sks内的位置。所以我必须使用SKReferenceNode来获得GameScene中的位置。

paddleRef = self.childNode(withName: "paddleScene") as! SKReferenceNode

所以现在我必须跟踪两个变量而不是一个变量。是否有更简单的方法在没有多个变量的情况下导入场景中的外部对象?

2 个答案:

答案 0 :(得分:1)

您可以发布用于创建划线的代码吗?您在GameScene中用来引用球拍的代码?

引用的节点(在您的情况下是paddle)是SKReferenceNode的子节点。这意味着您的拨片分配行应为:

let paddle = paddleRef.childNode(withName: "paddle")

然后你应该只需要使用paddle而不是paddleRef。

或者我会为paddle创建一个专用类,作为SKSpriteNode的子类。它将处理与桨叶相关的所有事物 - 它的位置,旋转,大小,透明度,图像,色彩等。

然后在任何场景中重用paddle变得非常容易 - 只需在场景代码中创建此类的实例,如下所示:

let paddle = Paddle()

(我假设您将为您的桨类命名" Paddle")。然后你只处理一个对象,你的桨属性就可以正常工作 - paddle.position,paddle.zRotation,paddle.size等。

如果您需要有关如何设置桨类的任何帮助,请与我们联系。

斯托

答案 1 :(得分:1)

我最近开始使用场景编辑器(几乎),我喜欢我的对象的视觉布局。我为复杂的对象(不仅仅是场景)创建场景(sks)文件,然后使用参考节点将它们放置在我的场景文件中,这样我就可以在多个场景中重复使用它们,并可视化它们如何布局。我没有真正找到绕过双引用的方法,但这就是我在代码中处理引用节点的方法。这种方法允许我将它们放置在场景编辑器中,但仍然可以在不关心额外物体的情况下进行定位。

if let paddleReference = self.childNode(withName: "paddle") as? SKReferenceNode {

    let paddleNode = paddleReference.getBasedChildNode() as? SKSpriteNode

    self.paddle = paddleNode?.copy() as! SKSpriteNode
    paddle.position = (paddleReference.position)
    addChild(paddle)
    paddleNode?.removeFromParent()
    print("paddle.position \(paddle.position)")
}


extension SKReferenceNode {

    func getBasedChildNode() -> SKNode? {
        if let child = self.children.first?.children.first { return child }
        else { return nil }
    }
}
对于此扩展程序Add SKReferenceNode/SKScene to another SKScene in SpriteKit

会转到@SimonePistecchia