나는 테두리를 얻는 가장 좋은 방법이라고 생각합니다. 기본 아이디어는 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를 방문하십시오.
감사합니다. @Alessandro Ornano, 곧이 접근법을 점검 할 것입니다. –