真的没有办法设计SKLabelNode吗?

ham*_*obi 5 objective-c ios sprite-kit sklabelnode swift

真的没有办法设计SKLabelNode吗?我的意思是除了改变字体和颜色.我知道我可以做一些事情,比如通过在第一个后面创建第二个SKLabelNode来添加投影(已经排序很糟糕).为我的字体创建图像也会很糟糕,原因很明显.看起来奇怪的是你无法打破无聊的扁平文字.

我的意思是..即使spritekit节点计数有一个很酷的渐变风格......这是怎么做的?!

在此输入图像描述

好吧所以我在这里尝试重新创建渐变效果.我已经尝试了混合模式,颜色和colorBlendFactor的多种组合的每种组合.

α

α

在此输入图像描述

在此输入图像描述

这是代码

let testNode = SKLabelNode(text: "hey there")
testNode.fontSize = 30
testNode.color = SKColor.blueColor()
testNode.colorBlendFactor = 1
testNode.fontName = "Helvetica-Bold"
testNode.blendMode = SKBlendMode.Multiply
testNode.colorBlendFactor = 0.6
testNode.position = CGPoint(x: self.size.width/2, y: self.size.height/2)

self.addChild(testNode)
Run Code Online (Sandbox Code Playgroud)

小智 5

使用着色器非常容易。将一个名为“TheShader.fsh”的文本文件添加到您的项目中:

void main()
{
    float yPos = gl_FragCoord.y - labelBase;
    float gradient = yPos / u_sprite_size.y; // ranges from 0 at base to 1 at top

    vec4 color = SKDefaultShading(); // the current label color
    color = vec4(gradient + color.r, gradient + color.g, gradient + color.b, color.a);
    color.rgb *= color.a; // set background to alpha 0

    gl_FragColor = color;
}
Run Code Online (Sandbox Code Playgroud)

现在在 SKScene 中创建一个 SKEffectNode,将其着色器设置为“TheShader”,并将标签添加为效果节点的子节点。标签将使用垂直渐变绘制,范围从底部标签的字体颜色到顶部的白色。

override func didMoveToView(view: SKView)
{
    makeGradientLabel("318 nodes 60.0 fps", labelPosition: CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)))
}

func makeGradientLabel(labelText: String, labelPosition: CGPoint)
{
    let myShader = SKShader(fileNamed: "TheShader")
    let labelBase = SKUniform(name: "labelBase", float: Float(labelPosition.y))
    myShader.addUniform(labelBase)

    let effectNode = SKEffectNode()
    effectNode.shader = myShader
    effectNode.shouldEnableEffects = true
    addChild(effectNode)

    let theLabel = SKLabelNode(fontNamed: "Courier")
    theLabel.fontSize = 36
    theLabel.fontColor = SKColor.blueColor()
    theLabel.text = labelText
    theLabel.position = labelPosition

    effectNode.addChild(theLabel)
}
Run Code Online (Sandbox Code Playgroud)

如果移动标签,则需要更新 labelBase 制服,以便着色器知道它在哪里:

labelBase.floatValue = Float(theLabel.position.y)
Run Code Online (Sandbox Code Playgroud)


pro*_*cal 2

SKLabelNode 没有任何方法或属性可以让您实现渐变样式。正如评论中的链接所述,SpriteKit 确实有一个 SKBitmapFont 私有类,但这对您没有帮助。

您可以推出自己的解决方案或尝试字形设计器: https: //71squared.com/glyphdesigner