SpriteKit:场景中的静态背景与移动的 SKCameraNode

Posted

技术标签:

【中文标题】SpriteKit:场景中的静态背景与移动的 SKCameraNode【英文标题】:SpriteKit: static background in the scene with moving SKCameraNode 【发布时间】:2016-06-25 13:49:46 【问题描述】:

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

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

问题

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

我想要的是在背景中布置背景作为静态节点或视图,不必为了“跟随”相机而移动。

我尝试了什么

我知道可以将一个节点作为子节点添加到SKCameraNode,以确保它跟随相机。但正如 Apple 所暗示的,这对于通常呈现在所有内容之上的 HUD 元素(如乐谱标签等)很有用。如果你想添加背景,这当然不适用,因为我希望它在背景中,在作为子节点直接添加到场景中的节点后面。

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

我还尝试将背景作为子视图添加到 root SKView,但由于某种原因,我无法将它呈现在幕后。

提前致谢。

【问题讨论】:

【参考方案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)
    

【讨论】:

connect the cameraNode not to the scene but rather to a separate "panning node" 是什么意思? 没关系,这是一个死胡同,但上面应该可以正常工作。 您的解决方案有效。我尝试过同样的事情,但我的问题是我没有将我的 cameraNode 作为孩子添加到场景中。我确信我不必明确地这样做,因为系统已经提供了一个 camera 属性,等待被初始化并准备好在需要时使用。奇怪的是,即使我小时候没有将它添加到场景中,平移和与相机有关的所有其他内容都按预期工作。现在它起作用了。谢谢!

以上是关于SpriteKit:场景中的静态背景与移动的 SKCameraNode的主要内容,如果未能解决你的问题,请参考以下文章

从 SpriteKit 中的类播放音频

无法在 SK3DNode 上方显示精灵

如何在 iOS SpriteKit 中添加滚动背景效果。

Spritekit中的新场景没有显示任何内容?

在 SpriteKit 中将相机夹在场景的背景周围

从 SpriteKit 场景移动到 SwiftUI 视图