Spritekit бесконечный бегун родительский SKNode

Я знаком со Swift, но я начал копаться в спрайтеките. Я следовал учебнику о создании бесконечного бегуна. Подход, принятый автором, заключается в создании единого SKNode, который содержит все дочерние элементы. Этот контейнерный узел затем перемещается, а не перемещается все дочерние узлы по отдельности. Но что меня озадачило, так это то, что узел контейнера не имеет размера, связанного с ним, так что я немного запутался в том, как / почему это работает, и автор на самом деле не объясняет это.

Итак, мы имеем

    let containerNode = SKNode()
    let thePlayer = Player("image":"player") //SKSpriteNode
    let inc = 0
    override func didMoveToView(){
        self.anchorPoint = CGPointMake(0.5,0)
        addChild(containerNode )
       containerNode.addChild(player)
         moveWorld()
    }

   func moveWorld(){
      let moveWorldAction = SKAction.moveByX(-screenWidth, y:0, duration:6)
     let block = SKAction.runBlock(movedWorld)
      let seq = SKAction.sequence([moveWorldAction,block])
      let repeatAction = SKAction.repeatActionForever(seq)
      containerNode.runAction(repeatAction)
   }

   func movedWorld() {
     inc = inc + 1
     addObjects()

   }

   func addObjects() {
   let obj = Object()
   containerNode.addChild(obj)
   let ranX = arc4random_uniform(screenWidth)
   let ranY = arc4random_uniform(screenHeight)
   obj.position = CGPointMake(screenWidth * (inc + 1) + ranX, ranY) 
   }

Есть некоторое преобразование, которое я пропустил в приведенном выше коде из int в float, но это не обязательно для того, что я хочу понять.

Я понимаю, почему, когда создаются новые объекты, мы делаем кратность с приращением, но чего я не получаю, так это того, что containerNode не имеет размера, так почему это показывают дети? Это самый эффективный способ сделать это?

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

2 ответа

Решение

Если я правильно понимаю документацию по SKNode, этот небольшой раздел должен ответить на ваш вопрос:

Каждый узел в дереве узлов предоставляет систему координат своим дочерним элементам. После того, как дочерний элемент добавлен в дерево узлов, он помещается в систему координат своего родителя, устанавливая его свойства положения. Систему координат узла можно масштабировать и поворачивать, изменяя его свойства xScale, yScale и zRotation. Когда система координат узла масштабируется или поворачивается, это преобразование применяется как к собственному контенту узла, так и к его потомкам. Источник

Опять же, если я правильно читаю, кажется, что когда узел добавляется в дерево узлов, он наследует свою родительскую систему координат. Так по умолчанию containerNode такой же размер как self в этом случае.

Также в соответствии с frame Свойство SKNode:

Фрейм - это наименьший прямоугольник, содержащий содержимое узла, принимая во внимание свойства узла xScale, yScale и zRotation. Источник

Что снова звучит так, как будто кадр не установлен, он принимает наименьший прямоугольник (self в этом случае или можно понять, что это дети containerNode Я не уверен) так как это собственный кадр.

Как бы то ни было, он наследует его от другого SKNode.

С SKNode не отображается, ему не нужно (или не нужно) свойство размера. Только SKNode подклассы (SKLabelNode, SKShapeNodeи т. д.), которые являются видимыми, требуют размера (объявленного явно или неявно рассчитанного). Например, SpriteKit должен знать размер SKSpriteNode с текстурой 20 х 20, чтобы правильно сделать это. Ты можешь использовать SKNode"s calculateAccumulatedFrame метод определения общего размера (прямоугольник) всех потомков (кроме других SKNodes) в его дереве узлов.

Другие вопросы по тегам