10

我一直在我的游戏中使用以下代码。问题是我无法在 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];
4

4 回答 4

7

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

它在 GitHub 上可用:

https://github.com/downrightsimple/DSMultilineLabelNode

于 2014-02-12T21:20:39.203 回答
5

似乎SKLabelNode一次只支持一行文本。我在 SpriteKit 文档或任何其他官方文件中都找不到它,但在这个 WWDC 演示文稿的第 47 张幻灯片中提到了它。你必须使用UILabel它,你可以在这里看到解释

于 2013-09-26T18:06:38.257 回答
5

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

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

于 2013-09-26T19:52:06.820 回答
3

像许多其他人一样,我也需要解决这个问题。我的方法比 Chris 的解决方案简单得多。我做了一个SKLabelNode被调用的子类NORLabelNode

它在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,您可以随时更改文本、颜色、字体、字体大小等。

于 2014-04-20T08:47:39.520 回答