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