【问题标题】:\n not working in Sklabel SpriteKit\n 在 Sklabel SpriteKit 中不起作用
【发布时间】:2013-10-02 12:01:06
【问题描述】:

我一直在我的游戏中使用以下代码。问题是我无法在 spritekit 中制作多行标签,因为我可以使用 CCLabelTTF 来做......有人可以帮助我吗?我也无法在我的代码中使用 \t 或 \n ...感谢您提前回复

SKLabelNode *winner = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
winner.text = @"Another\nTest";
winner.fontSize = 32;
winner.fontColor = [SKColor blueColor];
winner.position = CGPointMake(100 , 160);
[self addChild:winner];

【问题讨论】:

    标签: xcode5 sprite-kit


    【解决方案1】:

    像许多其他人一样,我也需要解决这个问题。我的方法比 Chris 的解决方案简单得多。我创建了一个名为NORLabelNodeSKLabelNode 的子类。

    GitHub 有售,还有一个 cocoapod。

    它只是创建一组 SKLabelNode 并将它们用作子节点。如果你想自己实现类似的东西,主要的要点是这个方法:

    - (NSArray *)labelNodesFromText:(NSString *)text{
        NSArray *substrings    = [text componentsSeparatedByString:@"\n"];
        NSMutableArray *labelNodes    = [[NSMutableArray alloc] initWithCapacity:[substrings count]];
    
        NSUInteger labelNumber    = 0;
        for (NSString *substring in substrings) {
            SKLabelNode *labelNode    = [SKLabelNode labelNodeWithFontNamed:self.fontName];
            labelNode.text    = substring;
            labelNode.fontColor    = self.fontColor;
            labelNode.fontSize    = self.fontSize;
            labelNode.horizontalAlignmentMode    = self.horizontalAlignmentMode;
            labelNode.verticalAlignmentMode    = self.verticalAlignmentMode;
            CGFloat y    = self.position.y - (labelNumber * self.fontSize * self.lineSpacing);
            labelNode.position    = CGPointMake(self.position.x, y);
            labelNumber++;
            [labelNodes addObject:labelNode];
        }
    
        return [labelNodes copy];
    }
    

    以上内容有所简化,因为标签还从其父级继承了大部分其他属性。

    可以通过 CGFloat 属性更改行间距。除此之外,它就像普通的SKLabelNode 一样工作,您可以随时更改文本、颜色、字体、字体大小等。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。我创建了一个名为 DSMultilineLabelNode 的 SKLabelNode 替代品,它支持自动换行、换行等。底层实现将字符串绘制到图形上下文中,然后将其应用于 SKSpriteNode 上的纹理。

      它可以在 GitHub 上找到:

      https://github.com/downrightsimple/DSMultilineLabelNode

      【讨论】:

      • 感谢好友的帮助。
      【解决方案3】:

      您可以使用 NSLayoutManager 对字符串进行换行以匹配所需的宽度,正如 this question 所暗示的那样。

      请注意,NSLayoutManager在 iOS 上可用,从 iOS 7 开始。

      【讨论】:

        【解决方案4】:

        看来SKLabelNode 一次只支持一行文本。我在 SpriteKit 文档或其他任何官方文件中都找不到它,但在 this WWDC presentation. 的第 47 张幻灯片中提到了它,你必须改用 UILabel,你可以看到解释 here.

        【讨论】:

        • 我知道这是一个旧答案,但这个答案的第二部分让我很困扰,“改用 UILabel。”最后我知道UILabel不能在SKScene中使用,这里只解释了如何使用UILabel,而不是如何在SKScene中使用它。我能想到的唯一方法是您可以从隐藏的UILabel 中捕获渲染的内容,并将其放入SKSpriteNode 中(我实际上是在尝试避免这种方法,这让我想到了这个问题)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 2018-05-03
        相关资源
        最近更新 更多