我有两个SKLabelNodes,一个用于显示分数,另一个用作分数后面的阴影。每次我的球员经过一个球门时,我都会通过调用下面的updateScoreLabels()方法来更新分数标签,使其增加1分。
但是出于某种原因,无论我为这些SKLabelNodes中的每一个设置什么zPosition,这两个节点都是以随机顺序绘制的,每次我调用updateScoreLabels()方法时,它们的顺序都会随机颠倒。我将.ignoresSiblingOrder设置为什么似乎也无关紧要,如果我添加一个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)
}发布于 2019-04-11 03:33:37
正如我回答here:我通常创建枚举来建立zPositions,所以我可以简单地管理不同的层:
enum ZPositions: Int {
case background
case foreground
case player
case otherNodes
}因此,当您设置一个新项目时,您可以通过以下方式简单地为其提供zPosition:
button.zPosition = CGFloat(ZPosition.otherNodes.rawValue)
(button现在有最高的zPosition)希望它能有所帮助……
发布于 2019-04-09 04:18:05
每次更新标签时,尝试重置zPositions,看看是否可以解决问题。
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 = 10、zPosPlayer:CGFloat = 3、zPosBackground:CGFloat = -5等。这将帮助您更有条理,并最终减少应用程序中发生的错误。
希望这能有所帮助。
https://stackoverflow.com/questions/55551877
复制相似问题