如何在 SpriteKit 的所有设备上使文本大小相同?

How to make text the same size on all devices in SpriteKit?

在 SpriteKit 中,有没有办法让 SKLabelNode 看起来大小相同,而不管设备如何,例如:在 iPhone 5 上看起来与 6Plus 大小相同?

我试过使用别人推荐的这个方法:

let textRect = CGRect(x: 0, y: 0, width: frame.width * 0.4, height: frame.height * 0.045)
let scalingFactor = min(textRect.width / text.frame.width, textRect.height / text.frame.height)
text.fontSize *= scalingFactor

但它并不能使所有文本的大小都相同,因为像 "man" 这样的词在物理上没有像 "High" 这样的词那么高(因为它是 "y" 和 "h"伸出来)。

那么有没有一种方法可以让文本在所有设备上看起来都一样大呢?目前我像这样创建 SKLabelNode:

let text = SKLabelNode(text: "Start")
text.fontSize = 30
text.position = CGPoint(x: 0, y: 0)
addChild(text)

我觉得更像是一道算法题。考虑一下您需要在电视 iPad 或 iPhone 设备中实现相同的功能。你应该考虑存储它的绝对值而不是它的实际值。

公式应该是width for store value = actual width for this device / device width。身高也一样。然后,如果您在其他设备中使用相同的图像数据。您只需要乘以新设备 width/height.

这里的问题是您正在尝试缩放 fontSize,这对于复杂的十进制数字来说并不是很好。相反,在您创建标签后,只需将其缩放到您用来缩放其他所有内容的比例因子

let text = SKLabelNode(text: "Start")
text.fontSize = 30
text.position = CGPoint(x: 0, y: 0)

text.xScale = xScaleFactor
text.yScale = yScaleFactor

其中 xScaleFactoryScaleFactor 是您用来确定比例的因素。 (这个数字应该只需要计算一次,然后存储,如果你不这样做,我建议做那个改变)

基本上在您提供的代码中是这样完成的:

let textRect = CGRect(x: 0, y: 0, width: frame.width * 0.4, height: frame.height * 0.045)
let scaleFactorX = textRect.width / text.frame.width
let scaleFactorY = textRect.height / text.frame.height