[英]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
}
}
}
這是我對您的問題的意見。
我永遠都不會擴大規模。 遵循一般准則,如果按比例縮小,通常會保持質量。 放大可營造像素藝術感。
如果未使用標簽節點顯示經常更改的數字,請使用SKSpriteNode。 使用基本的照片編輯器鍵入標簽,並將其另存為要分配給spritenode的圖像。 Spritenodes可以處理物理,因此您應該使用它們來處理所有物理。
如果您確實需要顯示經常變化的大范圍數字,但仍然需要受到物理影響,那么您可能會問自己,我是否應該創建一個圖像,並為每個可能的結果分配給spritenode? 答案是不。 您可以將標簽大小設置為超出所需的大小,然后將其縮小。 要處理物理,您可以將此標簽添加為某些SKSpriteNode的子級,該子元素具有希望用於標簽的物理屬性。 現在,您有了一個spritenode,可以根據需要與物理進行交互,還具有一個標簽節點來顯示您的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.