2015-01-09 20 views
5

Gerçekten SKLabelNode tarzı bir yolu yok mu? Yazı tipini ve rengini değiştirmenin ötesinde demek istiyorum. Biliyorum, ilk bir arkasından ikinci bir SKLabelNode yaratarak bir alt gölge eklemek gibi bir şey yapabilirim (zaten sıralı bir şekilde hacky). Yazı tipim için resimler oluşturmak, açık nedenlerden dolayı çok kötü olurdu. Sıkıcı görünen düz metinden kurtulmak için yapabileceğiniz hiçbir şey yok gibi görünüyor.Gerçekten SKLabelNode tarzı bir yolu yok mu?

Yani, spritekit düğüm sayımının bile havalı bir gradyan stiline sahip olduğu ... nasıl yapılır? işte

enter image description here

tamam ben bir degrade etkisi yeniden oluşturmak çalışıyorum. Karışım modunun her kombinasyonunu ve birden fazla renk kombinasyonunu ve colorBlendFactor'ı denedim. alfa

alpha

çoklu

enter image description here

eklemek

enter image description here

burada degrade stilini yakalamak sağlayacak hiçbir yöntem veya SKLabelNode malı yoktur kodu

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) 
+0

"fontColor", "color" ve "colorBlendFactor" için doğru değerler nedir? blendMode da yardımcı olabilir. – rmaddy

+0

Sanırım sorum şu ki, spritekit – hamobi

+0

'u kullanarak yukarıdaki resimde gördüğüm nodecount yazı tipi gibi bir şey yaratırdınız. Ne aldığına bak. – rmaddy

cevap

2

olduğunu. Yorumlardaki bağlantıda belirtildiği gibi, SpriteKit'in bir SKBitmapFont özel sınıfı var, ancak bu size yardımcı olmayacak.

Kendi çözümünü rulo veya kabartma tasarımcı deneyebilirsiniz ya: https://71squared.com/glyphdesigner

3

Bir shader ile oldukça kolay. "TheShader.fsh" adlı proje için bir metin dosyasını ekleyin:

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; 
} 

Şimdi SKScene bir SKEffectNode oluşturmak, kendi shader için "TheShader" ayarlayın ve efekt düğümün Çocukken etiketi ekleyin. Etiket, etiketin fontColor'undan altta beyaza kadar uzanan dikey bir degrade kullanılarak çizilecektir. etiketi taşırsanız nerede olduğunu gölgelendirici bilecek böylece

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) 
} 

Eğer labelBase üniforma güncellemeniz gerekir: deneme yanılma bir sürü sonra

labelBase.floatValue = Float(theLabel.position.y) 
+0

Denedim ama etiket benim için sadece mavi. ObjC için yeniden yazdım ama umarım hiç hata yapmadım. – Jonny

+0

Konsolda bir hata mesajı alıyorum: ** error: bildirilmemiş tanımlayıcı 'SKDefaultShading' ** kullanımı – Jonny

+0

Oups bu konuyla ilgili bir konu var: http://stackoverflow.com/questions/31492404/spritekit-shader- çarpışma ios-9-skdefaultshading-gl-fragcoord – Jonny

1

, ben bu çalışma var:

{ 
     const CGFloat LABELFONTSIZE = 100; 
     SKColor* fontcolor = [SKColor redColor]; 

     UIFont* font = [AppDelegate fontOfType:Fonttype_main size:LABELFONTSIZE]; // LABELFONTSIZE not used here but whatever. 
     SKLabelNode* label = [SKLabelNode labelNodeWithFontNamed:font.fontName]; 
     label.fontColor = fontcolor; 
     label.verticalAlignmentMode = SKLabelVerticalAlignmentModeTop; 
     self.labelScore = label; 
     //label.zPosition = Z_HUD; 
     label.fontSize = LABELFONTSIZE; 

     self.score = 0; 

     const CGPoint LABELPOSITION = CGPointMake(self.size.width * 0.5, self.size.height); 
     label.position = LABELPOSITION; 

#define USESHADER 
#ifdef USESHADER 
     SKShader* myShader = [SKShader shaderWithFileNamed:@"TheShader"]; 
     NSAssert(myShader, @"myShader was nil!"); 

     SKEffectNode* effectNode = [SKEffectNode node]; 
     effectNode.zPosition = Z_HUD; 
     effectNode.shader = myShader; 
     effectNode.shouldEnableEffects = YES; 
     [self addChild:effectNode]; 

     [effectNode addChild:label]; 
#else 
     label.zPosition = Z_HUD; 
     [self addChild:label]; 
#endif 

     [label runAction:[SKAction repeatActionForever:[SKAction sequence:@[ 
                      [SKAction moveByX:0 y:-300 duration:3.0], 
                      [SKAction moveByX:0 y:300 duration:3.0], 
                      ]]]]; 
    } 

TheShader.fsh:

void main() 
{ 
    float gradient = v_tex_coord.y; 
    //vec4 color = SKDefaultShading(); // the current label color THIS DOES NOT WORK ON IOS 9.2 AND EARLIERISH (MAYBE IT DOES ON IOS 8) WORKS ONLY ON IOS 9.3 BETA AT THIS MOMENT! 
    vec4 color = texture2D(u_texture, v_tex_coord); 
    color = vec4(color.r + gradient, color.g + gradient, color.b + gradient, color.a); 
    color.rgb *= color.a; // set background to alpha 0 
    gl_FragColor = color; 
} 

Loengard'ın cevabına dayanıyor, ancak herhangi bir üniforma kullanmıyor. Gölgelendirici içindeki bazı öğeler, en son iOS 9.3 beta sürümü (20160115) dahil olmak üzere bir dizi iOS 9 sürümü üzerinde çalışmamıştır/çalışmaz. Yukarıdaki kod iyi çalışıyor, etiketin ekran üzerindeki konumunu bile önemsemiyor; Bunu onaylamak için etiketi yukarı/aşağı hareket ettiriyorum.