我遇到了SpriteKit的'addChild'方法的麻烦。
我试图在场景中添加一个简单的按钮,该按钮由一个背景图像和一个标签组成,所以我编写了如下代码:
override func didMove(to view: SKView) {
let buttonBg = SKSpriteNode(imageNamed: "mainButton_green")
let buttonLabel = SKLabelNode(text: "Label")
self.addChild(buttonBg)
self.addChild(buttonLabel)
}
然后我在模拟器上运行该程序,发现结果很奇怪。有时它看起来正确,像这样: correct appearence
但是有时,“ buttonLabel”将位于“ buttonBg”之后,如下所示: wrong appearence
为什么?
ps。我有print self.children,在每种情况下结果都是'[buttonBg,buttonLabel]',我的skview.ignoresSiblingOrder始终为false。
答案 0 :(得分:0)
您可以做的几件事
let buttonBg = SKSpriteNode(imageNamed: "mainButton_green")
buttonBg.zPosition = 1
let buttonLabel = SKLabelNode(text: "Label")
buttonLabel.zPosition = 2
这将手动设置对象的z分层
我还认为,如果要创建按钮对象,则应将标签添加为背景的子项
let buttonBg = SKSpriteNode(imageNamed: "mainButton_green")
buttonBg.zPosition = 1
let buttonLabel = SKLabelNode(text: "Label")
buttonLabel.zPosition = 1
self.addChild(buttonBg)
buttonBg.addChild(buttonLabel)
即使zPosition是唯一的孩子,我也总是添加它。
答案 1 :(得分:0)
您的问题不是真正的问题:在创建元素时,按照情况,将按照以下规则在主线程中呈现它们:
zPosition
属性 alpha
属性 因此,可能会在您的按钮背景之前绘制诸如label
之类的东西,从而引起这种令人讨厌的方面。
要创建按钮时要做的一件好事应该是:
let buttonBg = SKSpriteNode(imageNamed: "mainButton_green")
self.addChild(buttonBg)
let buttonLabel = SKLabelNode(text: "Label")
buttonBg.addChild(buttonLabel)
换句话说,将标签设为背景的孩子,这将为您保证正确的zPosition
水平(无需更改zPosition
属性),如果您尚未更改(保持不变)元素的label
,请始终将CGPoint.zero
的位置正确设置(默认为anchorPoint
)。