Sprite kit Spritekit无头流道父节点

Sprite kit Spritekit无头流道父节点,sprite-kit,sknode,Sprite Kit,Sknode,我对斯威夫特很熟悉,但我已经开始涉足斯威夫特。我一直在遵循一个关于创建一个无止境的跑步者的教程。作者采用的方法是创建一个包含所有子节点的SKNode。然后移动此容器节点,而不是单独移动所有子节点。但让我感到困惑的是,容器节点没有与其关联的大小,因此我对如何/为什么这样做有点困惑,作者也没有真正解释它 所以我们有 let containerNode = SKNode() let thePlayer = Player("image":"player") //SKSpriteNode

我对斯威夫特很熟悉,但我已经开始涉足斯威夫特。我一直在遵循一个关于创建一个无止境的跑步者的教程。作者采用的方法是创建一个包含所有子节点的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没有大小,所以为什么它的子节点会显示出来?这是最有效的方法吗


我假设这只是一种方便,而不是单独移动所有其他对象,但它没有大小这一事实让我感到困惑。

如果我正确理解SKNode的文档,这一小部分应该回答您的问题:

节点树中的每个节点都为其节点提供一个坐标系 儿童将子节点添加到节点树后,将对其进行定位 通过设置其位置在其父坐标系内 财产。节点的坐标系可以通过以下方式进行缩放和旋转: 更改其xScale、yScale和zRotation属性。当节点的 如果缩放或旋转坐标系,则应用此变换 节点自身的内容及其子体的内容。

同样,如果我读对了,那么当一个节点被添加到一个节点树中时,它似乎继承了它的父坐标系。因此,默认情况下,
containerNode
的大小与本例中的
self
相同

同样根据SKNode的
frame
属性:

框架是包含节点内容的最小矩形, 考虑节点的xScale、yScale和zRotation 财产

这听起来又像是,如果一个框架没有设置,它会将最小的矩形(
self
,在本例中,或者可以理解为它是
containerNode
的子元素,我不确定)作为它自己的框架


不管是什么情况,它都是从另一个SKNode继承的。

由于未呈现
SKNode
,因此它不需要(或具有)size属性。只有可见的
SKNode
子类(
SKLabelNode
SKShapeNode
等)需要一个大小(显式声明或隐式计算)。例如,SpriteKit需要知道具有20 x 20纹理的
SKSpriteNode
的大小才能正确渲染。您可以使用
SKNode
calculateacumeratedframe
方法来确定其节点树中所有子体(而不是其他
SKNode
s)的总大小(矩形)。

我喜欢将SKNode想象成宇宙,它正在无限扩展,
SKNode
无法从其父节点继承其大小,因为它没有大小。此外,只有
原点
(位置)属性用于
SKNode
s。帧的
size
属性始终为(宽度:0,高度:0)。