为什么SpriteKit的'addChild'方法导致混乱

时间:2018-07-20 16:30:26

标签: ios sprite-kit

我遇到了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。

2 个答案:

答案 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)。