SKLabelNode не уважает zPosition? - PullRequest
       16

SKLabelNode не уважает zPosition?

1 голос
/ 06 апреля 2019

У меня есть два SKLabelNodes, один из которых отображает счет, а другой действует как тень за счетом. Каждый раз, когда мой игрок проходит через цель, я обновляю метки очков, увеличивая их на 1 пункт, вызывая метод updateScoreLabels (), приведенный ниже.

Но по какой-то причине, независимо от того, какую zPosition я установил для каждого из этих узлов SKLabelNode, два узла рисуются в случайном порядке, и каждый раз, когда я вызываю метод 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)
}

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Как я ответил здесь : я обычно создаю перечисления для создания zPositions, поэтому я могу просто управлять различными слоями:

enum ZPositions: Int {
    case background
    case foreground
    case player
    case otherNodes
}
  • «case case» - это нижняя позиция, она равна позиции по умолчанию 0;
  • «case foreground» = 1
  • «case player» = 2
  • «регистр других узлов» = 3

Итак, когда вы настраиваете новый элемент, вы можете задать ему zPosition просто так:

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

(кнопка теперь имеет самое высокое значение zPosition) Надеюсь, это поможет ...

0 голосов
/ 08 апреля 2019

Попробуйте сбрасывать 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.

столько слоев

Сохраняйте и повторно используйте zPositions ваших слоев в экземпляре Singleton, и у вас есть категориальная система, например: zPosHUD:CGFloat = 10, zPosPlayer:CGFloat = 3, zPosBackground:CGFloat = -5 и т. Д. Это поможет вам быть более организованным и, в конечном итоге, уменьшит количество ошибок. встречаются в вашем приложении.

Надеюсь, это поможет.

...