簡體   English   中英

如何在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物理,或者可以嗎?

謝謝

我運行了[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]]];

我使用我敲過的此類首先將其渲染為紋理,然后可以將過濾模式設置為.nearest。

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
        }

    }

}

這是我對您的問題的意見。

  1. 我永遠都不會擴大規模。 遵循一般准則,如果按比例縮小,通常會保持質量。 放大可營造像素藝術感。

  2. 如果未使用標簽節點顯示經常更改的數字,請使用SKSpriteNode。 使用基本的照片編輯器鍵入標簽,並將其另存為要分配給spritenode的圖像。 Spritenodes可以處理物理,因此您應該使用它們來處理所有物理。

  3. 如果您確實需要顯示經常變化的大范圍數字,但仍然需要受到物理影響,那么您可能會問自己,我是否應該創建一個圖像,並為每個可能的結果分配給spritenode? 答案是不。 您可以將標簽大小設置為超出所需的大小,然后將其縮小。 要處理物理,您可以將此標簽添加為某些SKSpriteNode的子級,該子元素具有希望用於標簽的物理屬性。 現在,您有了一個spritenode,可以根據需要與物理進行交互,還具有一個標簽節點來顯示您的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM