我应该如何调整 SpriteKit 中标签节点的大小?

How should I resize label nodes in SpriteKit?

所以我的场景中有几个 SKLabelNodes,如下所示:

SKLabelNode *label1 = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
label1.text = @"Hello World!";
label1.fontColor = [SKColor redColor];
label1.fontSize = 90;
label1.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
[self addChild: label1];

当场景开始时,我想让它们放大。我为此使用了 SKAction,但是 scaleBy 导致文本模糊并且 resizeTo 不起作用。

另外我猜这不是处理字体的方法。有没有更好的方法,或者我应该使用 UILabels?我不想那样做,因为那意味着我不能在上面使用 SpriteKit 物理,或者我可以吗?

谢谢

我 运行 a [SKAction scaleBy: 从字体大小 10 到比例因子 8,当按 3 或更大的比例增加大小时,文本模糊是正确的。

您可以使用块来随着时间的推移增加字体大小。您将不得不使用很多步骤,但结果要好得多。

myInt = 10;

SKAction *block0 = [SKAction runBlock:^{
    label0 = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
    label0.text = @"Hello World!";
    label0.fontColor = [SKColor redColor];
    label0.fontSize = myInt;
    label0.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
    [self addChild: label0];
}];

SKAction *wait0 = [SKAction waitForDuration:1.5];

SKAction *wait1 = [SKAction waitForDuration:0.5];

SKAction *block1 = [SKAction runBlock:^{
    label0.fontSize += (myInt + 10);
}];

[self runAction:[SKAction sequence:@[wait0, block0, wait1, block1, wait1, block1, wait1, block1, wait1, block1, wait1, block1]]];

这是我对你的问题的看法。

  1. 我永远不会放大任何东西。按照一般准则,如果你缩小规模,你通常会保持质量。放大会产生像素艺术的感觉。

  2. 如果您不使用标签节点来显示经常变化的数字,请使用 SKSpriteNode。使用基本的照片编辑器输入标签并将其保存为要分配给 spritenode 的图像。 Spritenodes 是用来处理物理的,所以你应该用它们来处理你所有的物理。

  3. 如果您确实需要显示范围广泛且经常变化的数字,但您仍然需要它们受物理影响,您可能会问自己,我是否应该为每个可能的图像创建一个图像我可以分配给我的 spritenode 的结果?答案是不。您可以将标签大小设置为比您需要的大得多,然后按比例缩小。要处理物理,您可以将此标签添加为某个 SKSpriteNode 的子节点,该节点具有您希望用于标签的物理属性。现在,您有一个 spritenode 可以根据需要与物理交互,还有一个 label 节点可以显示您的信息。

我用这个我敲出来的class先把它渲染成贴图,然后你可以把过滤模式设置成贴图最近的。

import SpriteKit

public class PKTexturedLabelNode : SKSpriteNode{
    fileprivate let embeddedLabel : SKLabelNode

    fileprivate var rasterizingView : SKView? {
        if let rasterizeInView = rasterizeInView {
            return rasterizeInView
        } else {
            return scene?.view
        }
    }

    public var rasterizeInView : SKView?

    public required init?(coder aDecoder: NSCoder) {
        embeddedLabel = SKLabelNode()
        super.init(coder: aDecoder)
    }

    public init(fontNamed: String?){
        embeddedLabel = SKLabelNode(fontNamed: fontNamed)
        super.init(texture: nil, color: SKColor.white, size: CGSize(width: 0, height: 0))
    }

    public init(text:String?){
        embeddedLabel = SKLabelNode(text: text)
        super.init(texture: nil, color: SKColor.white, size: CGSize(width: 0, height: 0))

    }

    var fontName : String? {
        get {
            return embeddedLabel.fontName
        }
        set {
            embeddedLabel.fontName = newValue
            render()
        }
    }

    var fontSize : CGFloat {
        get {
            return embeddedLabel.fontSize
        }
        set {
            embeddedLabel.fontSize = newValue
            render()
        }
    }

    var text : String? {
        get {
            return embeddedLabel.text
        }
        set {
            embeddedLabel.text = newValue
            render()
        }
    }

    fileprivate func render(){
        if let texture = rasterizingView?.texture(from: embeddedLabel){
            texture.filteringMode = .nearest
            size = texture.size()
            self.texture = texture
        }

    }

}