SpriteKit 中 CGRect 的原点
Origin point of a CGRect in SpriteKit
我正在尝试将一些特定大小的文本居中放置在场景的中心。
func addCubeExperienceLabel(_ buttonSize : CGSize, _ buttonPos : CGPoint, _ world : Int) {
let price = SKLabelNode(fontNamed: "LCDSolid")
price.text = String(WorldPrices.fromInt(world).rawValue)
price.zPosition = 50
adjustLabelFontSizeToFitRect(labelNode: price, rect: CGRect(origin: CGPoint(x: 0, y: 0), size : buttonSize))
self.addChild(price)
}
所以我使用 adjustLabelFontSizeToFitRect:
adjustLabelFontSizeToFitRect(labelNode: price, rect: CGRect(origin: CGPoint(x: 0, y: 0), size : buttonSize))
将SKNodeLabel的大小调整为特定大小。但我希望那个标签的原点是屏幕的中心,所以 (0,0),因为锚点是 0.5,0.5。但是,我明白了:
adjustLabelFontSizeToFitRect() 是这样的:
func adjustLabelFontSizeToFitRect(labelNode:SKLabelNode, rect:CGRect) {
// Determine the font scaling factor that should let the label text fit in the given rectangle.
let scalingFactor = min(rect.width / labelNode.frame.width, rect.height / labelNode.frame.height)
// Change the fontSize.
labelNode.fontSize *= scalingFactor
// Optionally move the SKLabelNode to the center of the rectangle.
labelNode.position = CGPoint(x: rect.midX, y: rect.midY - labelNode.frame.height / 2.0)
}
查看 SKLabelNode 的 horizontalAlignmentMode
和 verticalAlignmentMode
。它有点像标签的 "anchor point",可用于调整 SKLabelNode 中文本的水平和垂直位置。
默认情况下,verticalAlignmentMode
设置为 .baseline,horizontalAlignmentMode
设置为 .center。所以 "origin" 并不完全位于标签的 (center, center)。
不知道这是否是您想要的效果,但如果您希望标签在场景中居中,我只需在 addCubeExperienceLabel
方法中添加这些行:
price.position = CGPoint.zero
price.verticalAlignmentMode = .center
price.horizontalAlignmentMode = .center
如果您希望文本 start 位于屏幕中央,请将 horizontalAlignmentMode 设置为 .left。现在文本的中心位于屏幕的中心。
请注意,标签的位置设置在 addCubeExperienceLabel
而不是 adjustLabelFontSizeToFitRect
。如果你调整标签的字体大小,它应该仍然保持在它的位置,就像一个普通的 SKSpriteNode 在它的大小调整后保持在它的位置。
希望对您有所帮助!
我正在尝试将一些特定大小的文本居中放置在场景的中心。
func addCubeExperienceLabel(_ buttonSize : CGSize, _ buttonPos : CGPoint, _ world : Int) {
let price = SKLabelNode(fontNamed: "LCDSolid")
price.text = String(WorldPrices.fromInt(world).rawValue)
price.zPosition = 50
adjustLabelFontSizeToFitRect(labelNode: price, rect: CGRect(origin: CGPoint(x: 0, y: 0), size : buttonSize))
self.addChild(price)
}
所以我使用 adjustLabelFontSizeToFitRect:
adjustLabelFontSizeToFitRect(labelNode: price, rect: CGRect(origin: CGPoint(x: 0, y: 0), size : buttonSize))
将SKNodeLabel的大小调整为特定大小。但我希望那个标签的原点是屏幕的中心,所以 (0,0),因为锚点是 0.5,0.5。但是,我明白了:
adjustLabelFontSizeToFitRect() 是这样的:
func adjustLabelFontSizeToFitRect(labelNode:SKLabelNode, rect:CGRect) {
// Determine the font scaling factor that should let the label text fit in the given rectangle.
let scalingFactor = min(rect.width / labelNode.frame.width, rect.height / labelNode.frame.height)
// Change the fontSize.
labelNode.fontSize *= scalingFactor
// Optionally move the SKLabelNode to the center of the rectangle.
labelNode.position = CGPoint(x: rect.midX, y: rect.midY - labelNode.frame.height / 2.0)
}
查看 SKLabelNode 的 horizontalAlignmentMode
和 verticalAlignmentMode
。它有点像标签的 "anchor point",可用于调整 SKLabelNode 中文本的水平和垂直位置。
默认情况下,verticalAlignmentMode
设置为 .baseline,horizontalAlignmentMode
设置为 .center。所以 "origin" 并不完全位于标签的 (center, center)。
不知道这是否是您想要的效果,但如果您希望标签在场景中居中,我只需在 addCubeExperienceLabel
方法中添加这些行:
price.position = CGPoint.zero
price.verticalAlignmentMode = .center
price.horizontalAlignmentMode = .center
如果您希望文本 start 位于屏幕中央,请将 horizontalAlignmentMode 设置为 .left。现在文本的中心位于屏幕的中心。
请注意,标签的位置设置在 addCubeExperienceLabel
而不是 adjustLabelFontSizeToFitRect
。如果你调整标签的字体大小,它应该仍然保持在它的位置,就像一个普通的 SKSpriteNode 在它的大小调整后保持在它的位置。
希望对您有所帮助!