SpriteKit: статический фон в сцене с движущимся SKCameraNode
Моя цель - иметь статический узел на фоне 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)
}
}