如何从SKLabelNode
中提取多边形路径?例如,我希望像这样的数字的边路径沿着SKSpriteNode
:
你认为可能吗?或者我必须为每个字符创建一个多边形,如:
var pathNumberOne = CGPathCreateMutable()
CGPathMoveToPoint(pathNumberOne , nil, 0, 0)
CGPathAddLineToPoint(pathNumberOne , nil, 20, 0)
CGPathAddLineToPoint.....
........
........
答案 0 :(得分:0)
我认为最好的办法就是获得边界。
基本想法是使用SKShapeNode
绘制边框并将其添加为SKLabelNode
的子项。像这样:
if let path = createBorderPathForText() {
let border = SKShapeNode()
border.strokeColor = borderColor
border.lineWidth = 7;
border.path = path
border.position = positionBorder(border)
labelNode.addChild(border)
}
困难的部分是如何为文本创建边框。这是Core Text
开始的地方。使用函数CTFontGetGlyphsForCharacters
,您可以检索文本字符串中所有字符的字形。对于每个字形,您可以使用CGPath
创建CTFontCreatePathForGlyph
。您唯一要做的就是将所有字符的CGPath
加在一起,并在SKShapeNode
中使用它。您可以使用函数CGPathAddPath
执行此操作。要获得字形/字符的相对位置,可以使用函数CTFontGetAdvancesForGlyphs
。把它们放在一起:
private func createBorderPathForText() -> CGPathRef? {
let chars = getTextAsCharArray()
let borderFont = CTFontCreateWithName(self.fontName, self.fontSize, nil)
var glyphs = Array(count: chars.count, repeatedValue: 0)
let gotGlyphs = CTFontGetGlyphsForCharacters(borderFont, chars, &glyphs, chars.count)
if gotGlyphs {
var advances = Array(count: chars.count, repeatedValue: CGSize())
CTFontGetAdvancesForGlyphs(borderFont, CTFontOrientation.OrientationHorizontal, glyphs, &advances, chars.count);
let letters = CGPathCreateMutable()
var xPosition = 0 as CGFloat
for index in 0...(chars.count - 1) {
let letter = CTFontCreatePathForGlyph(borderFont, glyphs[index], nil)
var t = CGAffineTransformMakeTranslation(xPosition , 0)
CGPathAddPath(letters, &t, letter)
xPosition = xPosition + advances[index].width
}
return letters
} else {
return nil
}
}
你可以在github上找到一个名为 MKOutlinedLabelNode 的好项目here 有关更多详细信息,请访问此page有关spritekit中的大纲文本。