2014-05-09 20 views
12

मैं स्प्राइट किट में अपनी प्रगति पट्टी बनाना चाहता हूं।
मुझे लगा कि मुझे छवियों की आवश्यकता होगी - एक पूरी तरह से खाली प्रगति पट्टी और भरे प्रगति पट्टी।
मेरे पास उन छवियां हैं, मैंने खाली एक को शीर्ष पर रखा है, वे नियमित रूप से SKSPriteNodes हैं, मुझे पता नहीं लगा कि मैं अपनी भरी हुई छवि को कैसे कट करूं जहां मुझे चाहिए?स्प्राइट किट में प्रगति पट्टी कैसे बनाएं?

मैं निश्चित बिंदु पर SKSpriteNode छवि को कैसे हटा सकता हूं? शायद बनावट?

+0

आपको '+ (SKTexture *) बनावट द्वारा कॉल नोड के बनावट (पूरे रंग पट्टी माना जाता है) का सबसेट प्राप्त करने में सक्षम होना चाहिए: प्रदर्शन: ' – Aky

उत्तर

14

मैं SKCropNode में देखने की अनुशंसा करता हूं। एक विज़ुअल सहायता के लिए कैसे SKCropNode काम करता है, इसे Apple Programming Guide में देखें। मैंने पूरे दस्तावेज़ को कई बार पढ़ा है और यह विशेष रूप से अच्छा पढ़ा जाता है।

SKCropNode मूल रूप से एक एसकेएनओड है जिसे आप अपने दृश्य में जोड़ते हैं, लेकिन इसके बच्चों को मास्क द्वारा फसल किया जा सकता है। यह मुखौटा SKCropNode की maskNode संपत्ति में सेट है। इस तरह, आपको केवल एक बनावट छवि की आवश्यकता है। मैं मास्क को स्थानांतरित या आकार बदलने के लिए कार्यक्षमता को लागू करने के लिए SKCropNode को उपclass करता हूं, ताकि आप आसानी से इसकी उपस्थिति को अपडेट कर सकें।

@interface CustomProgressBar : SKCropNode 

/// Set to a value between 0.0 and 1.0. 
- (void) setProgress:(CGFloat) progress; 

@end 

@implementation CustomProgressBar 

- (id)init { 
    if (self = [super init]) { 
    self.maskNode = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(300,20)]; 
    SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"progressBarImage"]; 
    [self addChild:sprite]; 
    } 
    return self; 
} 

- (void) setProgress:(CGFloat) progress { 
    self.maskNode.xScale = progress; 
} 

@end 

अपने दृश्य में:

#import "CustomProgressBar.h" 

// ... 

CustomProgressBar * progressBar = [CustomProgressBar new]; 
[self addChild:progressBar]; 

// ... 

[progressBar setProgress:0.3]; 

// ... 

[progressBar setProgress:0.7]; 

नोट: इस कोड मुखौटा स्थानांतरित नहीं होता है (ताकि स्प्राइट दोनों तरफ काटा-छांटा जाएगा), लेकिन मुझे यकीन है कि आप विचार प्राप्त कर रहा हूँ।

+0

एसकेक्रॉप नोड में मास्क प्रॉपर्टी नहीं है, इसलिए मुझे लगता है कि यह मास्कनोड होना चाहिए? – Mike

+0

स्पॉट पर! मैंने आपके सुधार को दर्शाने के लिए उत्तर संपादित किया है। – CloakedEddy

+0

यह पूछने के लिए हाय खेद है लेकिन यह कोड स्प्रेड को 'प्रोग्रेसबार छवि' छवि के साथ दिखाता है लेकिन 'स्प्राइट नोडविथकॉलर: [एसकेसीओलर व्हाइटकॉलर]' कुछ भी नहीं करता है, वह क्यों है? मैं आईओएस 9 में विकास कर रहा हूं। –

7

काफी सरल: आपको एक फ्रेम छवि (वैकल्पिक) और "बार" छवि की आवश्यकता है। बार छवि एक एकल, ठोस रंग और जितनी अधिक हो उतनी अधिक हो और 1 या 2 पिक्सल चौड़ी हो। बार के रूप में एक SKShapeNode भी करेगा।

बस बार और एनिमेटिंग करना बस SKSpriteNode की आकार की संपत्ति को बदलने का विषय है। उदाहरण के लिए बार 0 और 100 के बीच प्रगति का प्रतिनिधित्व करने के लिए बस करें:

sprite.size = CGSizeMake(progressValue, sprite.size.height); 

जब भी प्रगति हो तो आकार अपडेट करें।

आप देखेंगे छवि दोनों छोड़ दिया और सही, यह केवल सही परिवर्तन anchorPoint को फैलाने छवि बाएँ संरेखित करने के लिए बनाने के लिए करने के लिए चौड़ाई में वृद्धि होगी:

sprite.anchorPoint = CGPointMake(0.0, 0.5); 

सब है। इसे अच्छी तरह से देखने के लिए इसके चारों ओर एक फ्रेम स्प्राइट बनाएं।

+0

हाँ यह अच्छा है अगर मेरे पास ठोस रंग और वर्ग है बार, लेकिन अगर मेरे पास जटिल बार है तो क्या होगा? और बस इसे काटना चाहते हैं? क्या स्प्राइट किट में बनावट को काटने या संचालित करने का कोई तरीका है? – Dvole

1

कोई छवि/बनावट "काटने" नहीं है।

कोकोस की पेशकश करने का एक विकल्प कुछ बनावट बनाने और स्वास्थ्य के आधार पर उन्हें अपने नोड में बदलने के लिए एक विकल्प है। मैंने एक ऐसा गेम किया जहां स्वास्थ्य बार ने हर 10 अंक बनावट बदल दी (सीमा 0-100 थी)। हालांकि कुछ परीक्षण और त्रुटि के बाद, मैंने अभी तक कोकोस को पहले से सुझाए गए कार्यों को समाप्त कर दिया।

enter image description here

+1

वहाँ _is_ छवि को काटने का एक तरीका है, कृपया मेरा उत्तर संदर्भ 'एसकेक्रॉप नोड' देखें। – CloakedEddy

3

HealthBarNode मान लिया जाये कि एक सार्वजनिक संपत्ति health कि 0.0 और 1.0 और जिसका उन्हें पैतृक संपत्ति texture चौड़ाई _textureWidth (एक निजी संपत्ति) के पूरे रंग बार छवि से उत्पन्न होता है के बीच भिन्न होता है के साथ SKSpriteNode का एक उपवर्ग है, तो आप कुछ इस तरह कर सकता है:

- (void)setHealth:(CGFloat)fraction 
{ 
    self.health = MIN(MAX(0.0, fraction), 1.0); // clamp health between 0.0 and 1.0 
    SKTexture *textureFrac = [SKTexture textureWithRect:CGRectMake(0, 0, fraction, 1.0) inTexture:self.texture]; 
// check docs to understand why you can pass in self.texture as the last parameter every time 

    self.size = CGSizeMake(fraction * _textureWidth, self.size.height); 
    self.texture = textureFrac; 
} 

एक नया मान स्वास्थ्य बार का कारण होगा करने के लिए health स्थापना (मुख्य दृश्य के लिए एक बच्चे के रूप में जोड़ा, कहते हैं) ठीक से काटा करने के लिए।

+0

फिर भी एक और तरीका 'एसकेक्रॉप नोड' – Aky

+0

का उपयोग करना होगा, मैं इस के लिए एक और विकल्प के रूप में 'एसकेक्रॉप नोड' जोड़ूंगा और इसे भेजूंगा। :) – prototypical

+0

मुझे इस विधि का उपयोग कर बनावट के स्थान पर कचरा मिलता है। मैंने विभिन्न मूल्यों को बदलने की कोशिश की, लेकिन वही, मूल बनावट पीला है, और मुझे ग्रे बकवास के साथ कुछ नीला मिलता है। – Dvole

1

मैंने इसे ऐसा किया, और यह पूरी तरह से काम करता है।

baseBar = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(CGRectGetMidX(self.frame)-40, self.frame.size.height/10)]; 
//The following will make the health bar to reduce from right to left 
//Change it to (1,0.5) if you want to have it the other way 
//But you'd have to play with the positioning as well 
[baseBar setAnchorPoint:CGPointMake(0, 0.5)]; 
CGFloat goodWidth, goodHeight; 
goodHeight =self.frame.size.height-(baseBar.frame.size.height*2/3); 
goodWidth =self.frame.size.width-(10 +baseBar.frame.size.width); 
[baseBar setPosition:CGPointMake(goodWidth, goodHeight)]; 
[self addChild:baseBar]; 

मैं तो एक एक SKShapeNode साथ बार, के लिए 'फ्रेम' कहा, भरण रंग (clearcolour) के बिना, और एक स्ट्रोक का रंग::

//The following was so useful 
SKShapeNode *edges = [SKShapeNode shapeNodeWithRect:baseBar.frame]; 
edges.fillColor = [UIColor clearColor]; 
edges.strokeColor = [UIColor blackColor]; 
[self addChild:edges]; 

तो सबसे पहले, मैं एक SKSpriteNode घोषित

जब मैं स्वास्थ्य को कम करना चाहता था, मैंने किया था निम्नलिखित:

if (playerHealthRatio>0) { 
     playerHealthRatio -= 1; 
     CGFloat ratio = playerHealthRatio/OriginalPlayerHealth; 
     CGFloat newWidth =baseBar.frame.size.width*ratio; 
     NSLog(@"Ratio: %f newwidth: %f",ratio,newWidth); 
     [baseBar runAction:[SKAction resizeToWidth:newWidth duration:0.5]]; 
    }else{ 
//  NSLog(@"Game over"); 
    } 

, सरल, स्वच्छ और नहीं ग बिल्कुल कम

1

वह यह है कि तेजी से में मेरे ProgressBar:

import Foundation 

import SpriteKit 


class IMProgressBar : SKNode{ 

var emptySprite : SKSpriteNode? = nil 
var progressBar : SKCropNode 
init(emptyImageName: String!,filledImageName : String) 
{ 
    progressBar = SKCropNode() 
    super.init() 
    let filledImage = SKSpriteNode(imageNamed: filledImageName) 
    progressBar.addChild(filledImage) 
    progressBar.maskNode = SKSpriteNode(color: UIColor.whiteColor(), 
     size: CGSize(width: filledImage.size.width * 2, height: filledImage.size.height * 2)) 

    progressBar.maskNode?.position = CGPoint(x: -filledImage.size.width/2,y: -filledImage.size.height/2) 
    progressBar.zPosition = 0.1 
    self.addChild(progressBar) 

    if emptyImageName != nil{ 
     emptySprite = SKSpriteNode.init(imageNamed: emptyImageName) 
     self.addChild(emptySprite!) 
    } 
} 
func setXProgress(xProgress : CGFloat){ 
    var value = xProgress 
    if xProgress < 0{ 
     value = 0 
    } 
    if xProgress > 1 { 
     value = 1 
    } 
    progressBar.maskNode?.xScale = value 
} 

func setYProgress(yProgress : CGFloat){ 
    var value = yProgress 
    if yProgress < 0{ 
     value = 0 
    } 
    if yProgress > 1 { 
     value = 1 
    } 
    progressBar.maskNode?.yScale = value 
} 
required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

}

// उपयोग कैसे करें:

let progressBar = IMProgressBar(emptyImageName: "emptyImage",filledImageName: "filledImage") 

या

let progressBar = IMProgressBar(emptyImageName: nil,filledImageName: "filledImage") 

और किसी भी करने के लिए इस Progressbar जोड़ने SKNode:

self.addChild(progressBar) 

// यह सब कुछ है।

+0

धन्यवाद @ बाइक बहुत! – Tritmm

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