SKLabelNode不尊重zPosition?

时间:2019-04-06 17:53:42

标签: ios swift xcode sprite-kit

我有两个SKLabelNode,一个显示得分,另一个在得分后面充当阴影。每当我的球员通过一个球门时,我都会通过调用下面的updateScoreLabels()方法来更新得分标签,使其增加1分。

但是出于某种原因,无论我为这些SKLabelNode中的每一个设置什么zPosition,这两个节点都是以随机顺序绘制的,并且每次我调用updateScoreLabels()方法时,它们的顺序都会随机翻转。我将.ignoresSiblingOrder设置为什么也无关紧要,如果我将一个SKLabelNode添加为另一个SKLabelNode的孩子,那也没有关系。节点只是完全忽略zPosition。我究竟做错了什么?这是我的代码:

在didMoveToView()中调用此方法:

func createScoreLabel() {
    //Configure score label
    scoreLabel = SKLabelNode(fontNamed: "8BIT WONDER Nominal")
    scoreLabel.text = "O"
    scoreLabel.fontSize = 32
    scoreLabel.position = CGPoint(x: -UIScreen.main.bounds.size.width/2 - scoreLabel.frame.size.width/2, y: UIScreen.main.bounds.size.height/2 - scoreLabel.frame.size.height/2 - 60)
    scoreLabel.zPosition = 999

    //Configure shadow
    scoreLabelShadow.attributedText = NSAttributedString(string: "O", attributes: scoreLabelShadowAttributes)
    scoreLabelShadow.position = CGPoint(x: -UIScreen.main.bounds.size.width/2 - scoreLabel.frame.size.width/2, y: UIScreen.main.bounds.size.height/2 - scoreLabel.frame.size.height/2 - 60)
    scoreLabelShadow.zPosition = -9999999999

    //Add labels
    cam.addChild(scoreLabel)
    cam.addChild(scoreLabelShadow)

    //Animate labels
    scoreLabel.run(SKAction.move(to: CGPoint(x: -UIScreen.main.bounds.size.width/2 + scoreLabel.frame.size.width/2 + 30, y: UIScreen.main.bounds.size.height/2 - scoreLabel.frame.size.height/2 - 60), duration: 0.1))
    scoreLabelShadow.run(SKAction.move(to: CGPoint(x: -UIScreen.main.bounds.size.width/2 + scoreLabel.frame.size.width/2 + 30, y: UIScreen.main.bounds.size.height/2 - scoreLabel.frame.size.height/2 - 60), duration: 0.1))
}

,然后在我增加得分标签时调用它。每当这称为zPositions随机翻转时:

func updateScoreLabel() {
    let formattedScore = String(score).replacingOccurrences(of: "0", with: "O")

    scoreLabel.text = String(formattedScore)
    scoreLabelShadow.attributedText = NSAttributedString(string: formattedScore, attributes: scoreLabelShadowAttributes)
}

2 个答案:

答案 0 :(得分:1)

当我回答here时:我通常创建枚举来建立zPosition,因此我可以简单地管理不同的层:

curl
  • “案例背景”位于较低位置,等于默认位置0;
  • “案例前景” = 1
  • “案例播放器” = 2
  • “案例其他节点” = 3

因此,当您设置新项目时,可以通过以下方式简单地为其赋予zPosition:

button.zPosition = CGFloat(ZPosition.otherNodes.rawValue)

(按钮现在具有最高的zPosition)希望对您有帮助...

答案 1 :(得分:0)

每次更新标签时尝试重置zPosition,看看是否可以解决。

func updateScoreLabel() {
    let formattedScore = String(score).replacingOccurrences(of: "0", with: "O")

    scoreLabel.text = String(formattedScore)
    scoreLabelShadow.attributedText = NSAttributedString(string: formattedScore, attributes: scoreLabelShadowAttributes)
    scoreLabel.zPosition = 999
    scoreLabelShadow.zPosition = -9999999999
}

此外,将zPosition的范围设置为999到-9999999999也不是一个好习惯,这可能是导致问题的原因。我非常怀疑,您的SKSCene中有那么多图层。

Singleton实例中存储并重复使用图层的zPosition,并具有分类系统,即:zPosHUD:CGFloat = 10zPosPlayer:CGFloat = 3zPosBackground:CGFloat = -5等。这将为您提供帮助更有条理,最终在您的应用程序中将出现更少的错误。

希望这会有所帮助。