2016-06-21 60 views
1

にはどうすればSKLabelNodeからポリゴンパスを抽出することができますか?たとえば、私はこのような数のエッジパスがSKSpriteNodeに沿って移動したい:SKLabelNodeからCGPathを取得するには?

enter image description here

あなたは可能だと思いますか?または、各文字のポリゴンを次のように作成する必要があります。

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

答えて

0

境界線を取得するには最良の方法だと思います。 基本的な考え方は、境界線を描画し、あなたの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をご覧ください。

+1

おかげ@Alessandroオルナーノ、私はすぐにこのアプローチをチェックしましょう! –

関連する問題