2016-06-25 157 views
0

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

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

问题

如果我只想补充的背景节点作为孩子的场景,我将不得不移动以同样的方式相机转动的背景下,为了有背景总是完全在相机的视口内可见。我不想这样做,因为背景节点会应用一些视觉效果和滤镜,因此移动它会导致性能下降。

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

有什么我试过

我知道,一个节点可以以确保其符合相机被添加为孩子SKCameraNode。但正如苹果所言,这对HUD元素比如乐谱标签等是非常有用的,而这些元素通常都是高于一切的。如果你想添加背景,这当然是不适用的,因为我希望它在背景中,在作为子节点直接添加到场景中的节点后面。尽管如此,我试图将相关节点作为子节点添加到相机节点,并使用z位置和类似的东西进行播放,但没有任何帮助,如预期的那样。

我也尝试将背景作为子视图添加到根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) 
    } 
} 
+0

你是什么意思?将cameraNode连接到场景而不是单独的“平移节点”? – damirstuhec

+0

没关系,这是一个死胡同,但上述应该工作得很好。 –

+0

您的解决方案有效。我尝试过同样的事情,但我的问题是我没有将我的'cameraNode'作为孩子添加到场景中。我确信我不必明确地这样做,因为系统已经提供了一个'camera'属性,等待被初始化并且如果需要就准备好了。奇怪的是,即使我没有把它作为一个孩子添加到场景中,平移和其他所有关于相机的工作都如预期的那样工作。现在它可以工作。谢谢! – damirstuhec