15

Sprite Kit のフォントのドロップシャドウまたはアウトラインのサポートが見つかりません。ドロップシャドウについては、2 番目の SKLabelNode を作成して、もう一方の背後にオフセットできると思います。

アウトラインまたはドロップシャドウに SKEffectNode を利用できる方法はありますか? おそらく SKLabelNode を SKEffectNode の子にしますか?

アップデート :

最初の SKLabelNode の後ろにある 2 番目の SKLabelNode (黒でオフセット) を使用して、適切なドロップシャドウを取得できました。他の潜在的なオプションにまだ興味がありますが、それはうまくいくようです.

4

10 に答える 10

18

これはおそらくあなたがしていることですが、機能し、簡単です。

- (SKLabelNode *) makeDropShadowString:(NSString *) myString
{
    int offSetX = 3;
    int offSetY = 3;

    SKLabelNode *completedString = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
    completedString.fontSize = 30.0f;
    completedString.fontColor = [SKColor yellowColor];
    completedString.text = myString;


    SKLabelNode *dropShadow = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
    dropShadow.fontSize = 30.0f;
    dropShadow.fontColor = [SKColor blackColor];
    dropShadow.text = myString;
    dropShadow.zPosition = completedString.zPosition - 1;
    dropShadow.position = CGPointMake(dropShadow.position.x - offSetX, dropShadow.position.y - offSetY);

    [completedString addChild:dropShadow];

    return completedString;
}

アウトライン 1 も試してみます...しかし、もっとトリッキーになる気がします...ビットマップ フォントを使用する方法があるに違いありません..??? bmグリフ ...

于 2013-10-07T05:40:01.503 に答える
3

Kelin の優れた点に加えて、Swift 4コードは次のとおりです。

var label: SKLabelNode!
let attStr: NSMutableAttributedString = NSMutableAttributedString(string: "MyDefaultText")
let myFont: UIFont = UIFont(name: "FontName", size: 7)!

attStr.mutableString.setString("MyText")
attStr.addAttribute(.font, value: myFont, range: NSMakeRange(0, attStr.length))
attStr.addAttribute(.foregroundColor, value: UIColor.white, range: NSMakeRange(0, attStr.length))
attStr.addAttribute(.strokeColor, value: UIColor.red, range: NSMakeRange(0, attStr.length))
attStr.addAttribute(.strokeWidth, value: -3.0, range: NSMakeRange(0, attStr.length))

label.attributedText = attStr

PS:ストローク塗りを同時に取得するには、の値をに適用する必要があります.strokeWidth。これは、ストロークが外側に向かっていることを意味します。に正の値を指定する.strokeWidthと、ストロークが内側に送られ、塗りつぶしの色 ( .foregroundColor) が消えます。

于 2018-06-14T08:20:10.677 に答える
2

MKOutlinedLabelNodeをお勧めします。

例:

let textNode = MKOutlinedLabelNode(fontNamed: "Helvetica", fontSize: 32)
textNode.borderColor = UIColor.blackColor()
textNode.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center
textNode.fontColor = UIColor.blueColor()
textNode.outlinedText = "Test"

ここに画像の説明を入力

ASAttributedLabelNodeも確認できます。

于 2016-09-03T18:41:11.890 に答える
1

これは私のために働いた:

http://battleofbrothers.com/sirryan/outline-text-in-spritekit

ASAttributedLabelNode と組み合わせて使用​​したコードは次のとおりです (フォント名/サイズ/塗りつぶし色/アウトライン色など、私に固有のものもありますが、もちろん独自のものを使用してください)。

func outlinedCenteredString(string : String, size: CGFloat) -> NSAttributedString
{
    var myMutableString : NSMutableAttributedString
    var font =  UIFont(name: "Super Mario 256", size: size)!
    var alignment : CTTextAlignment = CTTextAlignment.TextAlignmentCenter
    let alignmentSetting = [CTParagraphStyleSetting(spec: .Alignment, valueSize: Int(sizeofValue(alignment)), value: &alignment)]
    var paragraphRef = CTParagraphStyleCreate(alignmentSetting, 1)

    let textFontAttributes = [
        NSFontAttributeName : font,
        // Note: SKColor.whiteColor().CGColor breaks this
        NSForegroundColorAttributeName: UIColor.yellowColor(),
        NSStrokeColorAttributeName: UIColor.blackColor(),
        // Note: Use negative value here if you want foreground color to show
        NSStrokeWidthAttributeName:-3
        //,NSParagraphStyleAttributeName: paragraphRef
    ]

    myMutableString = NSMutableAttributedString(string: string, attributes: textFontAttributes as [NSObject : AnyObject])

    let para = NSMutableParagraphStyle()
    para.headIndent = 00
    para.firstLineHeadIndent = 00
    para.tailIndent = 0
    para.lineBreakMode = .ByWordWrapping
    para.alignment = .Center
    para.paragraphSpacing = 0
    myMutableString.addAttribute(
        NSParagraphStyleAttributeName,
        value:para, range:NSMakeRange(0,1))
    return myMutableString
}

この機能を使用するには、次のものを使用します。

    let hintSize = CGFloat(80.0)
    let hintLabel = ASAttributedLabelNode(size:CGSizeMake(playableRect.size.width*0.9, hintSize))

    hintLabel.attributedString = outlinedCenteredString("Touch the Rope to Release the Wood", size: hintSize)

    hintLabel.position =
        CGPointMake(
            size.width/2.0,
            ((size.height - playableRect.size.height)/2.0) + hintSize/2.0
    )

    hintLabel.zPosition = kHintZPosition
    addChild(hintLabel)
于 2015-07-06T21:01:02.757 に答える
0

コンストラクターに渡されたパラメーターに従って、必要な SKLabelNode と 4 つのシャドウ ラベルを作成する SKSpriteNode から継承するクラスを作成しました。

パブリック プロパティを変更した場合は、 update() メソッドを呼び出す必要があります。(BorderSize が 6 ~ 7 を超えると、おかしく見えます。)

import Foundation
import SpriteKit

class LFOutlinedLabel : SKSpriteNode {

    private let skewX : [CGFloat] = [-1, 1, 1,-1]
    private let skewY : [CGFloat] = [-1,-1, 1, 1]

    private var label : SKLabelNode = SKLabelNode()
    private var shadows : [SKLabelNode] = []

    public var borderOpacity : CGFloat = 1
    public var borderSize: CGFloat = 1
    public var borderColor: UIColor = UIColor.black
    public var text : String = "?"
    public var fontName : String = Fonts.OptimaExtraBlack.rawValue
    public var fontColor: UIColor = UIColor.white
    public var fontSize : CGFloat = 40

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        //self.setup()
    }

    override init(texture: SKTexture!, color: UIColor, size: CGSize) {
        super.init(texture: texture, color: color, size: size)
        //self.setup()
    }

    convenience init(size: CGSize, font: String, fSize: CGFloat, fColor: UIColor, bSize: CGFloat, bColor: UIColor, bOpacity: CGFloat)
    {
        self.init(texture: nil, color: UIColor.clear, size: size)
        self.fontName = font
        self.fontSize = fSize
        self.fontColor = fColor
        self.borderSize = bSize
        self.borderColor = bColor
        self.borderOpacity = bOpacity
        self.setup()
    }

    // create shadow labels
    private func setup() {
        if shadows.count == 0 {
            let width = self.size.width / 2
            let height = self.size.height / 2
            for j in 0...3 {
                let shadow = SKLabelNode(text: self.text)
                addChild(shadow)
                shadow.verticalAlignmentMode = .center
                shadow.horizontalAlignmentMode = .center
                shadow.zPosition = 999
                shadow.position = CGPoint(x: width + (skewX[j] * borderSize) , y: height + (skewY[j] * borderSize))
                shadow.text = self.text
                shadow.fontSize = self.fontSize
                shadow.fontName = self.fontName
                shadow.fontColor = borderColor
                shadows.append(shadow)
            }
            let label = SKLabelNode(text: self.text)
            addChild(label)
            label.verticalAlignmentMode = .center
            label.horizontalAlignmentMode = .center
            label.zPosition = 1000
            label.position = CGPoint(x: width , y: height )
            label.text = self.text
            label.fontSize = self.fontSize
            label.fontName = self.fontName
            label.fontColor = fontColor
            self.label = label
        }
    }

    public func update(){
        let width = self.size.width / 2
        let height = self.size.height / 2

        self.label.fontSize = fontSize
        self.label.fontName = fontName
        self.label.fontColor = fontColor
        self.label.verticalAlignmentMode = .center
        self.label.horizontalAlignmentMode = .center
        self.label.text = text
        self.label.position = CGPoint(x: width  , y: height )

        for i in 0...3 {
            shadows[i].verticalAlignmentMode = .center
            shadows[i].horizontalAlignmentMode = .center
            shadows[i].fontColor = borderColor
            shadows[i].fontSize = fontSize
            shadows[i].alpha = borderOpacity
            shadows[i].fontName = fontName
            shadows[i].text = text
            shadows[i].position = CGPoint(x: width + (skewX[i] * borderSize) , y: height + (skewY[i] * borderSize) )
        }
    }
}

最近のコードはhttps://gist.github.com/detaybey/214b23731a3b4d0344ce58643795f4b7にあります。

于 2016-11-11T14:18:50.613 に答える
0

Erica Sadun はかつて、ここに基づいてドロップ シャドウを作成しました。SKEffectNode

最近、彼女の Swift4 バージョンを作成する必要がありましたShadowLabelNode: https://gist.github.com/Bersaelor/d6ea241278665173485e8aabafbe9047

于 2018-08-16T11:23:26.320 に答える
0

アウトラインに関して:

簡単な答え: あなたの仕事はあなたのためにカットされています。
長い答え:あなたは本当にあなたの仕事を切り詰めました。

プロジェクトでこれを行ってきましたが、基本的なアプローチは、UILabel を作成し、それをスプライトに入るテクスチャにレンダリングすることでした。
UILabel にアウトラインを表示するには、これを使用できます: UILabel にアウトライン 化されたテキストを表示するにはどうすればよいですか? それをUIImageにレンダリングするには([SKTexture textureWithImage:img]でテクスチャを作成できます)、これを使用します: UILabelから画像を作成する方法は? これには多くの問題が伴います。その主なものは遅くて貪欲なレンダリングであり、静的テキストを可能な限りファイルに事前レンダリングすることで大部分が解決されました。

フォントが必要とする傾向がある精度のため、効果ノードでこれを実現できるとは思いません。振り返ってみると、この道を進む前によく考えました。

于 2013-10-06T18:08:55.593 に答える
0

OOPを使用してください!これを SKNode の子孫である新しいコンポーネントとして実装しました。これには、テキスト自体用とその影用の 2 つの SKLabelNode が含まれています。

final class TgSKLabelWithShadow: SKNode
{
    private var lblText: SKLabelNode!
    private var lblShadow: SKLabelNode!

    var text: String?
        {     get { return lblText.text }
        set { lblText.text   = newValue
              lblShadow.text = newValue   } }

    var fontColor: UIColor?
        { get { return lblText.fontColor     }
          set { lblText.fontColor = newValue } }
    // define additional getters/setters, if necessary.


    init(     position: CGPoint,
              alignment: SKLabelHorizontalAlignmentMode,
              text: String,
              fontName: String,
              fontSize: CGFloat,
              fontColor: UIColor,
              shadowColor: UIColor,
              shadowOffSet: CGPoint)
    {
        super.init()
        self.position = position

        lblShadow = SKLabelNode(text: text)
        lblShadow.fontName  = fontName
        lblShadow.fontColor = shadowColor
        lblShadow.fontSize  = fontSize
        lblShadow.horizontalAlignmentMode = alignment
        lblShadow.position = shadowOffSet
        self.addChild(lblShadow)  // add shadow first

        lblText = SKLabelNode(text: text)
        lblText.fontName  = fontName
        lblText.fontColor = fontColor
        lblText.fontSize  = fontSize
        lblText.horizontalAlignmentMode = alignment
        self.addChild(lblText)  // on top of shadow
    }

    required init?(coder aDecoder: NSCoder)
    {
        fatalError("TgSKLabelWithShadow - init(coder:) has not been implemented")
    }
}

次のようにインスタンス化して親 (別のノードまたはシーン) に追加します。

   ndInfo2 = TgSKLabelWithShadow(
        position: CGPoint(x: size.width/2, y:   size.height - 170),
        alignment : .Center,
        text: "ndInfo2: ???",
        fontName: "Avenir",
        fontSize: 40,
        fontColor: colorText,
        shadowColor: UIColor.blueColor(),
        shadowOffSet: CGPoint(x:1, y:-1))
    addChild(ndInfo2)

アウトライン?まあ、アウトラインを確立するためにさらに別の SKLabelNode をネストすることを妨げるものは何もありません。(ラベルよりもわずかに大きいと計算できます。) 子ラベルを追加する順序が関連していることに注意してください。

このコードはテスト済みで、現在作成中の Apple TV アプリで実際に使用されています。よろしく、テッド。

于 2016-08-19T22:55:45.150 に答える