我熟悉Swift,但是我已经开始涉猎spritekit。我一直在关注有关创建无尽奔跑者的教程。作者采用的方法是创建一个包含所有子代的单个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属性。当节点的
缩放或旋转坐标系,将应用此变换
既涉及节点本身的内容,也涉及其后代的内容。
Source


同样,如果我正确地阅读了此内容,则似乎将节点添加到节点树时会继承其父坐标系。因此,在这种情况下,默认情况下containerNodeself的大小相同。

同样根据SKNode的frame属性:


框架是包含节点内容的最小矩形,
考虑到节点的xScale,yScale和zRotation
属性。 Source


再次听起来像是如果未设置框架,它将占据最小的矩形(在这种情况下为self,或者我可能不确定这是containerNode的子代),因为它是自己的框架。

无论是哪种情况,它都是从另一个SKNode继承过来的。

关于sprite-kit - Spritekit无尽的运行者 parent SKNode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39257654/

10-10 05:36