首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKLabelNode不尊重zPosition?

SKLabelNode不尊重zPosition?
EN

Stack Overflow用户
提问于 2019-04-07 01:53:42
回答 2查看 106关注 0票数 1

我有两个SKLabelNodes,一个用于显示分数,另一个用作分数后面的阴影。每次我的球员经过一个球门时,我都会通过调用下面的updateScoreLabels()方法来更新分数标签,使其增加1分。

但是出于某种原因,无论我为这些SKLabelNodes中的每一个设置什么zPosition,这两个节点都是以随机顺序绘制的,每次我调用updateScoreLabels()方法时,它们的顺序都会随机颠倒。我将.ignoresSiblingOrder设置为什么似乎也无关紧要,如果我添加一个SKLabelNode作为另一个的子级,也不会有什么不同。这些节点完全忽略了zPosition。我做错了什么?下面是我的代码:

此方法在didMoveToView()中调用:

代码语言:javascript
复制
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翻转随机翻转:

代码语言:javascript
复制
func updateScoreLabel() {
    let formattedScore = String(score).replacingOccurrences(of: "0", with: "O")

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

回答 2

Stack Overflow用户

发布于 2019-04-11 03:33:37

正如我回答here:我通常创建枚举来建立zPositions,所以我可以简单地管理不同的层:

代码语言:javascript
复制
enum ZPositions: Int {
    case background
    case foreground
    case player
    case otherNodes
}

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

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

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

(button现在有最高的zPosition)希望它能有所帮助……

票数 1
EN

Stack Overflow用户

发布于 2019-04-09 04:18:05

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

代码语言:javascript
复制
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实例中存储和重用您的层的zPositions,并有一个分类系统,即:zPosHUD:CGFloat = 10zPosPlayer:CGFloat = 3zPosBackground:CGFloat = -5等。这将帮助您更有条理,并最终减少应用程序中发生的错误。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55551877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档