SpriteKit: статический фон в сцене с движущимся SKCameraNode

Моя цель - иметь статический узел на фоне SKScene. В этой сцене я использую SKCameraNode для панорамирования по мере необходимости.

Фоновый узел должен быть статичным, потому что он представляет небо вдали, которое, как ожидается, не будет двигаться.

Проблема:

Если бы я просто добавил фоновый узел в качестве дочернего элемента сцены, мне пришлось бы перемещать фон так же, как панорамируется камера, чтобы фон всегда был полностью виден внутри окна просмотра камеры. Я не хочу этого делать, потому что к фоновому узлу применены некоторые визуальные эффекты и фильтры, и поэтому его перемещение приводит к падению производительности.

Я хочу, чтобы фон располагался на заднем плане в виде статического узла или вида, который не нужно было бы перемещать, чтобы «следовать» за камерой.

Что я пробовал:

Я знаю, что узел можно добавить как дочерний к SKCameraNode, чтобы убедиться, что он следует за камерой. Но, как предполагает Apple, это полезно для элементов HUD, таких как метки очков и т. д., которые обычно отображаются поверх всего. Это, конечно, неприменимо, если вы хотите добавить фон, так как я хочу, чтобы он был на заднем плане, за узлами, которые добавляются как дочерние узлы непосредственно в сцену.

Несмотря на это, я попытался добавить фоновый узел в качестве дочернего элемента к узлу камеры и поиграть с позицией z и тому подобными вещами, но ничего не помогло, как и ожидалось.

Я также пытался добавить фон в качестве подпредставления к корневому SKView, но по какой-то причине мне не удалось отобразить его за сценой.

Заранее спасибо.


person damirstuhec    schedule 25.06.2016    source источник


Ответы (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)
    }
}
person T. Benjamin Larsen    schedule 25.06.2016
comment
Что вы имеете в виду под connect the cameraNode not to the scene but rather to a separate "panning node"? - person damirstuhec; 25.06.2016
comment
Неважно, это был тупик, но вышеописанное должно работать нормально. - person T. Benjamin Larsen; 25.06.2016
comment
Ваше решение работает. Я пробовал то же самое, но моя проблема заключалась в том, что я не добавлял в сцену своего cameraNode в качестве дочернего элемента. Я был убежден, что мне не нужно делать это явно, поскольку уже есть свойство camera, предоставленное системой, ожидающее инициализации и готовое к работе, если это необходимо. Как ни странно, панорамирование и все остальное, что касается камеры, работало, как и ожидалось, хотя я не добавлял ее в сцену в детстве. Теперь это работает. Благодарю вас! - person damirstuhec; 25.06.2016