Je pense que la meilleure façon de le faire est d'obtenir les bordures. L'idée de base est d'utiliser un SKShapeNode
pour dessiner la bordure et l'ajouter en tant qu'enfant de votre SKLabelNode
. Quelque chose comme ceci:
if let path = createBorderPathForText() {
let border = SKShapeNode()
border.strokeColor = borderColor
border.lineWidth = 7;
border.path = path
border.position = positionBorder(border)
labelNode.addChild(border)
}
La partie difficile est de savoir comment créer une bordure pour votre texte. C'est là que Core Text
entre en jeu. Avec la fonction CTFontGetGlyphsForCharacters
vous récupérez les glyphes pour tous les caractères de votre chaîne de texte. Pour chaque glyphe, vous pouvez créer le CGPath
en utilisant CTFontCreatePathForGlyph
. La seule chose que vous avez à faire est d'ajouter le CGPath
de tous les caractères ensemble et l'utiliser dans votre SKShapeNode
. Vous pouvez le faire en utilisant la fonction CGPathAddPath
. Pour obtenir les positions relatives des glyphes/caractères, vous pouvez utiliser la fonction CTFontGetAdvancesForGlyphs
. Mettre tous ensemble:
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
}
}
Vous pouvez trouver un beau projet here sur github appelé MKOutlinedLabelNode et pour plus de détails, visitez aussi cette page sur le texte de contour en spritekit.
Merci @Alessandro Ornano, je vais vérifier bientôt cette approche! –