我有两个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)
}
答案 0 :(得分:1)
当我回答here时:我通常创建枚举来建立zPosition,因此我可以简单地管理不同的层:
curl
因此,当您设置新项目时,可以通过以下方式简单地为其赋予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 = 10
,zPosPlayer:CGFloat = 3
,zPosBackground:CGFloat = -5
等。这将为您提供帮助更有条理,最终在您的应用程序中将出现更少的错误。
希望这会有所帮助。