境界線を取得するには最良の方法だと思います。 基本的な考え方は、境界線を描画し、あなたのSKLabelNode
の子として追加するSKShapeNode
を使用することです。このようなもの:
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
を使用すると、あなたのテキスト文字列内のすべての文字のグリフを取得します。グリフごとにCTFontCreatePathForGlyph
を使用してCGPath
を作成できます。あなたがしなければならない唯一のことは、すべての文字のCGPath
を一緒に追加し、SKShapeNode
でこれを使用することです。これを行うには、関数CGPathAddPath
を使用します。グリフ/文字の相対位置を取得するには、関数CTFontGetAdvancesForGlyphs
を使用します。すべて一緒にそれを置く:あなたはgithubの上で素敵なプロジェクトhereを見つけることができます
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
}
}
はMKOutlinedLabelNode と呼ばれ、詳細はSpriteKitベースでアウトラインテキストについても、このpageをご覧ください。
おかげ@Alessandroオルナーノ、私はすぐにこのアプローチをチェックしましょう! –