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)
    }
}
Другие вопросы по тегам