2015-01-09 4 views
5

क्या SKLabelNode शैली को वास्तव में कोई रास्ता नहीं है? मेरा मतलब फ़ॉन्ट, और रंग बदलने से परे है। मुझे पता है कि मैं पहले के पीछे एक दूसरा SKLabelNode बनाकर एक ड्रॉप छाया जोड़ने की तरह कुछ कर सकता हूं (पहले से ही हैकी है) .. मेरे फ़ॉन्ट के लिए छवियां बनाना स्पष्ट कारणों से भी भयानक होगा। ऐसा लगता है कि उबाऊ फ्लैट टेक्स्ट से बाहर निकलने के लिए आप कुछ भी नहीं कर सकते हैं।क्या SKLabelNode शैली को वास्तव में कोई रास्ता नहीं है?

मेरा मतलब है .. यहां तक ​​कि स्प्राइटकिट नोड गिनती भी एक अच्छी ढाल शैली है ... यह कैसे किया जाता है ?!

enter image description here

ठीक है तो यहाँ मैं एक ढाल प्रभाव को पुनः उत्पन्न करने के लिए कोशिश कर रहा हूँ। मैंने मिश्रण मोड के हर संयोजन, और रंग के कई संयोजन, और colorBlendFactor की कोशिश की है।

अल्फा

alpha

गुणा

enter image description here

जोड़ने

enter image description here

यहाँ कोड

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', और 'colorBlendFactor' के लिए सही मानों के बारे में क्या? 'blendMode' भी मदद कर सकता है। – rmaddy

+0

मुझे लगता है कि मेरा सवाल यह है कि, क्या आप स्प्रिटकिट – hamobi

+0

का उपयोग करके उपरोक्त चित्रित नोडकाउंट फ़ॉन्ट की तरह कुछ बना सकते हैं जो मैंने अभी सुझाया है। देखें कि आपको क्या मिलता है। – rmaddy

उत्तर

2

कोई विधि या SKLabelNode की संपत्ति है कि आप ढाल शैली को प्राप्त करने के लिए सक्षम हो जाएगा है। जैसा कि टिप्पणियों में दिए गए लिंक में उल्लेख किया गया है, स्प्राइटकिट में एसकेबीटमैपफॉन्ट निजी वर्ग है, लेकिन यह आपकी मदद नहीं करेगा।

आप अपनी खुद की समाधान रोल कर सकते हैं या तो या ग्लिफ़ डिजाइनर का प्रयास करें: https://71squared.com/glyphdesigner

3

यह एक शेडर साथ बहुत आसान है। अपनी परियोजना "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; 
} 

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

आप लेबल ले जाते हैं आप ऐसा शेडर पता चल जाएगा कि वह कहाँ है labelBase वर्दी को अपडेट करना होगा:

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

मैंने कोशिश की लेकिन लेबल मेरे लिए सिर्फ नीला है। मैंने ओबीजेसी के लिए इसे फिर से लिखा था लेकिन उम्मीद है कि उसने कोई गलती नहीं की है। – Jonny

+0

मुझे कंसोल में एक त्रुटि संदेश मिलता है: ** त्रुटि: अविकसित पहचानकर्ता 'SKDefaultShading' का उपयोग ** – Jonny

+0

ओप्स इस मामले के बारे में एक संबंधित विषय है: http://stackoverflow.com/questions/31492404/spritekit-shader- दुर्घटना ios-9-skdefaultshading-जीएल-fragcoord – Jonny

1

परीक्षण और त्रुटि के एक बहुत बाद, मैं इस काम के हो गया है:

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

यह लोएन्गार्ड के उत्तर पर आधारित है, लेकिन किसी भी वर्दी का उपयोग नहीं करता है। शेडर के अंदर की कुछ चीजें आईओएस 9 संस्करणों पर काम नहीं करती हैं, जिनमें नवीनतम आईओएस 9.3 बीटा (20160115) शामिल है। उपरोक्त यह कोड अच्छी तरह से काम करता है, यह स्क्रीन पर लेबल की स्थिति की भी परवाह नहीं करता है; मैं इसकी पुष्टि करने के लिए लेबल को ऊपर और नीचे एनिमेट करता हूं।

संबंधित मुद्दे