2016-06-21 3 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

나는 테두리를 얻는 가장 좋은 방법이라고 생각합니다. 기본 아이디어는 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 함수를 사용하면 텍스트 문자열의 모든 문자에 대한 글리프를 검색 할 수 있습니다. 모든 글리프의 경우 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 Ornano, 곧이 접근법을 점검 할 것입니다. –