我应该如何调整 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]]];
这是我对你的问题的看法。
我永远不会放大任何东西。按照一般准则,如果你缩小规模,你通常会保持质量。放大会产生像素艺术的感觉。
如果您不使用标签节点来显示经常变化的数字,请使用 SKSpriteNode。使用基本的照片编辑器输入标签并将其保存为要分配给 spritenode 的图像。 Spritenodes 是用来处理物理的,所以你应该用它们来处理你所有的物理。
如果您确实需要显示范围广泛且经常变化的数字,但您仍然需要它们受物理影响,您可能会问自己,我是否应该为每个可能的图像创建一个图像我可以分配给我的 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
}
}
}
所以我的场景中有几个 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]]];
这是我对你的问题的看法。
我永远不会放大任何东西。按照一般准则,如果你缩小规模,你通常会保持质量。放大会产生像素艺术的感觉。
如果您不使用标签节点来显示经常变化的数字,请使用 SKSpriteNode。使用基本的照片编辑器输入标签并将其保存为要分配给 spritenode 的图像。 Spritenodes 是用来处理物理的,所以你应该用它们来处理你所有的物理。
如果您确实需要显示范围广泛且经常变化的数字,但您仍然需要它们受物理影响,您可能会问自己,我是否应该为每个可能的图像创建一个图像我可以分配给我的 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
}
}
}