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
метод определения общего размера (прямоугольник) всех потомков (кроме других SKNode
s) в его дереве узлов.