1

我正在使用 SpriteKit 编写一个小游戏,我在我的 SKScene 中添加了一个 SKLabelNode,初始文本仅为“0”。当我尝试使用以下方法更新此 SKLabel 的文本时:

func updateScoreLabel() {
        scoreNumber++
        scoreLabel.text = String(scoreNumber)
    }

整个 SKScene 在被调用和更新之间有一个短暂的停顿。但是,这仅在第一次调用时发生,因此如果我第二次运行此操作,例如在随后的任何场景暂停时更新 scoreLabel,则不会发生暂停。

触发方法调用的是... CC 是输入为 Int 的物理体 categoryBitMasks 的枚举

func isCollisionBetween(nodeTypeOne: CC, nodeTypeTwo: CC, contact: SKPhysicsContact) -> Bool {

    let isAnodeTypeOne = contact.nodeA.physicsBody!.categoryBitMask == nodeTypeOne.rawValue
    let isAnodeTypeTwo = contact.nodeA.physicsBody!.categoryBitMask == nodeTypeTwo.rawValue

    let isBnodeTypeOne = contact.nodeB.physicsBody!.categoryBitMask == nodeTypeOne.rawValue
    let isBnodeTypeTwo = contact.nodeB.physicsBody!.categoryBitMask == nodeTypeTwo.rawValue

    if (isAnodeTypeOne && isBnodeTypeTwo) || (isAnodeTypeTwo && isBnodeTypeOne) {
        return true
    } else {
        return false
    }

}

那么如果

    if isCollisionBetween(CC.TypeA, nodeTypeTwo: CC.TypeB, contact: contact) {

                updateScoreLabel()

}

有人可以指出问题。当检测到相同的碰撞并且使用 println 语句输出分数时,分数更新不会暂停场景,所以我认为它特定于更改 SKLabelNode 的文本

4

1 回答 1

1

您应该检查肯定会导致滞后的两件事:

  • 字体名称中的拼写错误

  • 您没有加载整个字体系列,即 Arial 而不仅仅是 Arial-BoldMT 或 Arial-ItalicMT。您想具体一点,因为在使用某些字体时加载整个字体系列可能会造成延迟。iOS 字体列表可以在这里找到。

如果您需要列出可用字体(并查看真实字体名称),您可以使用以下内容:

for familyName in UIFont.familyNames() as [String] {

  println("\(familyName)")

  for fontName in UIFont.fontNamesForFamilyName(familyName) as [String] {
    println("\tFont: \(fontName)")
  }

}

第一次初始化标签时(比如发生碰撞的那一刻),如果您使用iOS 中不可用的自定义字体,则可能会发生延迟。

在这种情况下,尝试在使用标签之前“预加载”字体。因此,在实际游戏之前,您应该实例化 SKLabelNode 并将其 text 属性设置为某个值。你必须设置一个文本属性,因为这样做字体将被预加载并准备好使用。否则它将在您设置标签的文本属性时加载。

编辑:

抱歉,我刚刚注意到您说您正在初始化一个带有初始文本的标签。因此,只需忽略与此相关的部分答案,并查找拼写错误和有关加载特定字体的部分。

希望这会带你去某个地方。祝你好运!

于 2015-05-25T00:57:29.963 回答