SpriteKit:场景中带有移动 SKCameraNode 的静态背景
SpriteKit: static background in the scene with moving SKCameraNode
我的目标是在后台有一个静态节点SKScene
。在此场景中,我使用 SKCameraNode
根据需要进行平移。
背景节点必须是静态的,因为它呈现的是远处的天空,预计不会移动。
问题:
如果我只是将背景节点作为子节点添加到场景中,我将不得不以与平移相机相同的方式移动背景,以便背景在相机的视口内始终完全可见。我不想这样做,因为背景节点应用了一些视觉效果和滤镜,因此移动它会导致性能下降。
我想要的是将背景作为静态节点或视图布置在背景中,无需为了 "follow" 相机而移动。
我尝试了什么:
我知道可以将节点作为子节点添加到 SKCameraNode
以确保它跟随相机。但正如 Apple 所建议的那样,这对于 HUD 元素(如分数标签等)非常有用,这些元素通常呈现在所有内容之上。如果你想添加背景,这当然不适用,因为我希望它在背景中,在作为子节点直接添加到场景的节点后面。
尽管如此,我尝试将背景节点作为子节点添加到相机节点并尝试使用 z 位置和类似的东西,但正如预期的那样,没有任何帮助。
我也尝试将背景作为子视图添加到根目录 SKView
但由于某种原因我无法在幕后呈现它。
提前致谢。
编辑:没关系,我的第一个答案是死胡同。虽然以下工作正常并且似乎是您已经尝试过的事情:将背景作为 child 添加到相机。
我想您刚刚遇到了 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)
}
}
我的目标是在后台有一个静态节点SKScene
。在此场景中,我使用 SKCameraNode
根据需要进行平移。
背景节点必须是静态的,因为它呈现的是远处的天空,预计不会移动。
问题:
如果我只是将背景节点作为子节点添加到场景中,我将不得不以与平移相机相同的方式移动背景,以便背景在相机的视口内始终完全可见。我不想这样做,因为背景节点应用了一些视觉效果和滤镜,因此移动它会导致性能下降。
我想要的是将背景作为静态节点或视图布置在背景中,无需为了 "follow" 相机而移动。
我尝试了什么:
我知道可以将节点作为子节点添加到 SKCameraNode
以确保它跟随相机。但正如 Apple 所建议的那样,这对于 HUD 元素(如分数标签等)非常有用,这些元素通常呈现在所有内容之上。如果你想添加背景,这当然不适用,因为我希望它在背景中,在作为子节点直接添加到场景的节点后面。
尽管如此,我尝试将背景节点作为子节点添加到相机节点并尝试使用 z 位置和类似的东西,但正如预期的那样,没有任何帮助。
我也尝试将背景作为子视图添加到根目录 SKView
但由于某种原因我无法在幕后呈现它。
提前致谢。
编辑:没关系,我的第一个答案是死胡同。虽然以下工作正常并且似乎是您已经尝试过的事情:将背景作为 child 添加到相机。
我想您刚刚遇到了 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)
}
}