2016-06-21 1 views
1

Comment puis-je extraire le chemin de polygone d'un SKLabelNode? Par exemple, je veux que le chemin de bord d'un numéro comme celui-ci de se déplacer le long d'un SKSpriteNode:Comment avoir CGPath de SKLabelNode?

enter image description here

Pensez-vous est possible? Ou je dois créer un polygone pour chaque caractère comme:

var pathNumberOne = CGPathCreateMutable() 
CGPathMoveToPoint(pathNumberOne , nil, 0, 0) 
CGPathAddLineToPoint(pathNumberOne , nil, 20, 0) 
CGPathAddLineToPoint..... 
........ 
........ 

Répondre

0

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.

+1

Merci @Alessandro Ornano, je vais vérifier bientôt cette approche! –