SpriteKit:移动SKCameraNode

时间:2016-06-25 13:49:46

标签: ios sprite-kit skspritenode skscene skcameranode

我的目标是在SKScene的后台设置一个静态节点。在这个场景中,我根据需要使用SKCameraNode进行平移。

背景节点必须是静态的,因为它呈现远距离的天空,预计不会移动。

问题

如果我只是将背景节点作为孩子添加到场景中,我将必须以相机平移的相同方式移动背景,以使背景始终在相机的视口内完全可见。我不想这样做,因为背景节点有一些视觉效果和过滤器应用于它,因此移动它会导致性能下降。

我想要的是将背景布局在背景中作为静态节点或视图,不必移动以便"跟随"相机。

我尝试了什么

我知道可以将一个节点作为子节点添加到SKCameraNode,以确保它跟随摄像机。但正如Apple建议的那样,这对于HUD元素(如分数标签等)非常有用,这些元素通常会呈现在所有内容之上。如果你想添加背景,这当然不适用,因为我希望它在后台,在作为子节点直接添加到场景的节点后面。

尽管如此,我尝试将背景节点作为孩子添加到相机节点并使用z位置和类似的东西进行游戏,但没有任何帮助,正如预期的那样。

我还尝试将背景作为子视图添加到根SKView但是由于某种原因我无法在场景后面渲染它。

提前致谢。

1 个答案:

答案 0 :(得分:1)

编辑:没关系我的第一个答案是死路一条。以下工作虽然似乎已经尝试过:将孩子的背景添加到相机中。

我猜你刚刚在zPosition上遇到了一些问题。根据我的意思,以下概念证明可以正常运作。

class GameScene: SKScene {
    let cameraNode = SKCameraNode()

    override func didMoveToView(view: SKView) {
        let center = CGPointMake(view.frame.size.width/2, view.frame.size.height/2)

        cameraNode.position = center
        addChild(cameraNode)
        camera = cameraNode
        let background = SKSpriteNode(color: SKColor.orangeColor(), size: view.frame.size)
        cameraNode.addChild(background)

        let sprite = SKSpriteNode(color: SKColor.redColor(), size: CGSizeMake(100, 100))
        sprite.position = center
        addChild(sprite)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let move = SKAction.moveBy(CGVectorMake(200, 0), duration: 2)
        cameraNode.runAction(move)
    }
}