我熟悉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
同样,如果我正确地阅读了此内容,则似乎将节点添加到节点树时会继承其父坐标系。因此,在这种情况下,默认情况下containerNode
与self
的大小相同。
同样根据SKNode的frame
属性:
框架是包含节点内容的最小矩形,
考虑到节点的xScale,yScale和zRotation
属性。 Source
再次听起来像是如果未设置框架,它将占据最小的矩形(在这种情况下为self
,或者我可能不确定这是containerNode
的子代),因为它是自己的框架。
无论是哪种情况,它都是从另一个SKNode继承过来的。
关于sprite-kit - Spritekit无尽的运行者 parent SKNode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39257654/