2012-07-11 10 views
39

मैं एक CAEmitterLayer एक कॉन्फ़ेटी प्रभाव बनाने के लिए स्थापित करने के लिए कोशिश कर रहा हूँ, और मैं दो मुद्दों हुई:CAEmitterLayer स्पर्श इवेंट का यादृच्छिक अवांछित कणों का उत्सर्जन करता है

  1. जब भी मैं करने के लिए मेरे कोशिकाओं पर birthRate सेट एनीमेशन शुरू करने के लिए कुछ गैर-शून्य मुझे स्क्रीन पर यादृच्छिक रूप से रखे गए कोशिकाओं का झुकाव मिलता है, जो सामान्य रूप से एनिमेट होता है, और फिर उसके बाद उत्सर्जक ठीक से उत्सर्जित रहता है।
  2. जब भी emitterCells स्क्रीन पर चीजें खींच रहे हैं, जब भी मैं स्क्रीन को छूता हूं, तो एमिटर emitterCells (यादृच्छिक) यादृच्छिक स्थानों में खींचता है जो एक (प्रतीत होता है) यादृच्छिक समय के लिए मौजूद होता है। एमिटर में कुछ भी स्पर्श स्पर्श घटनाओं से बंधे नहीं है (यानी मैं जानबूझकर टच इवेंट पर कुछ भी नहीं खींच रहा हूं), लेकिन परत एक ऐसे दृश्य में है जिसमें कई एम्बेडेड दृश्य हैं। जितना अधिक मैं स्पर्श करता हूं, उतना अधिक कोशिकाएं दिखाई देती हैं।

यहाँ emitter की स्थापना, और फिर शुरू करने और इसे रोकने के लिए अपने कोड है (एक बार मैं रोक समारोह कहा जाता है, तो नई यादृच्छिक तत्वों बनाने स्क्रीन संघर्ष पर टैप करता):

- (void)setupConfetti 
{ 
    self.confettiLayer = [CAEmitterLayer layer]; 
    [self.view.layer addSublayer:self.confettiLayer]; 
    [self.view.layer setNeedsDisplay]; 

    self.confettiLayer.emitterPosition = CGPointMake(1024.0/2,-50.0); 
    self.confettiLayer.emitterSize = CGSizeMake(1000.0, 10.0); 
    self.confettiLayer.emitterShape = kCAEmitterLayerLine; 
    self.confettiLayer.renderMode =kCAEmitterLayerUnordered; 

    CAEmitterCell *confetti = [CAEmitterCell emitterCell]; 

    confetti1.contents = (id)[[UIImage imageNamed:@"confetti.png"] CGImage]; 

    confetti.emissionLongitude = M_PI; 
    confetti.emissionLatitude = 0; 
    confetti.lifetime = 5; 
    confetti.birthRate = 0.0; 
    confetti.velocity = 125; 
    confetti.velocityRange = 50; 
    confetti.yAcceleration = 50; 
    confetti.spin = 0.0; 
    confetti.spinRange = 10; 
    confetti.name = @"confetti1"; 

    self.confettiLayer.emitterCells = [NSArray arrayWithObjects:confetti, nil]; 
} 

कॉन्फ़ेटी शुरू करने के लिए:

- (void)startConfettiAnimation 
{ 
    [self.confettiLayer setValue:[NSNumber numberWithInt:10.0] forKeyPath:@"emitterCells.confetti.birthRate"]; 
} 

और इसे रोकने के लिए:

- (void)stopConfettiAnimation 
{ 
    [self.confettiLayer setValue:[NSNumber numberWithInt:0.0] forKeyPath:@"emitterCells.confetti.birthRate"]; 
} 

फिर, एक बार यह शुरू हो जाने के बाद, यादृच्छिक तत्वों की प्रारंभिक झुकाव के बाद, यह ठीक काम करता है: सब कुछ सामान्य रूप से एनिमेट होता है, और जब जन्म दर को बाद में शून्य पर सेट किया जाता है, तो यह गहराई से समाप्त होता है। ऐसा लगता है कि टच इवेंट्स का जवाब देना है, और मुझे नहीं पता कि क्यों। मैंने emitterLayer को एक अलग दृश्य में जोड़ने का प्रयास किया है, उस दृश्य पर उपयोगकर्ता इंटरैक्शन को अक्षम कर रहा है, और उसके बाद इसे मुख्य दृश्य के सबव्यूव के रूप में जोड़ना है, और यह काम नहीं कर रहा था।

कोई भी मदद/अंतर्दृष्टि की सराहना की जाएगी!

धन्यवाद, सैम

+4

क्या आपको इसके बारे में कुछ पता चला? मुझे भी वही समस्या है। मुझे एक बहुत अनावश्यक "फीचर" की तरह लगता है। –

+4

शायद इस पोस्ट में आखिरी टिप्पणी के बाद से एक साल बाद किसी को इस समस्या का हल मिल गया? मैं इस समस्या को वेब पर स्थापित हर प्रोजेक्ट में देखता हूं जो CAEmitterLayer क्लास का उपयोग कर रहा है। आप इस ट्यूटोरियल के साथ भी कोशिश कर सकते हैं: http://www.raywenderlich.com/6063/uikit-particle-systems-in-ios-5- ट्यूटोरियल। बस वीसी से हैंडलिंग स्पर्श को हटाएं और उदाहरण के लिए जन्म 1 को कम करें, और कहीं भी टैप करना शुरू करें। टैप के बाद सभी लाइव कण दोगुनी लगते हैं। समस्या केवल सिम्युलेटर में नहीं, डिवाइस पर दिखाई देती है। –

उत्तर

1

यह है कि आप अगर कण Wenderlich उदाहरण Artur Ozieranski में तरह उत्सर्जित करती है पोस्ट देखने के लिए जाँच नहीं कर रहे हैं हो सकता है? जब तक जांच की जा रही है तब तक मुझे दोगुना नहीं दिख रहा है।

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [fireView setEmitterPositionFromTouch: [touches anyObject]]; 
    [fireView setIsEmitting:YES]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [fireView setIsEmitting:NO]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    [fireView setIsEmitting:NO]; 
} 
-(void)setIsEmitting:(BOOL)isEmitting 
{ 
    //turn on/off the emitting of particles 
    [fireEmitter setValue:[NSNumber numberWithInt:isEmitting?200:0] forKeyPath:@"emitterCells.fire.birthRate"]; 
} 
0

ज फ़ाइल

#import <UIKit/UIKit.h> 

    @interface DWFParticleView : UIView 

    -(void)setEmitterPositionFromTouch: (CGPoint*)t; 
    -(void)setIsEmitting:(BOOL)isEmitting; 

    @end 

मीटर फ़ाइल

#import "DWFParticleView.h" 
    #import <QuartzCore/QuartzCore.h> 

    @implementation DWFParticleView 
    { 
     CAEmitterLayer* fireEmitter; //1 
    } 

    -(void)awakeFromNib 
    { 
     //set ref to the layer 
     fireEmitter = (CAEmitterLayer*)self.layer; //2 
     //configure the emitter layer 
     fireEmitter.emitterPosition = CGPointMake(50, 50); 
     fireEmitter.emitterSize = CGSizeMake(10, 10); 

     CAEmitterCell* fire = [CAEmitterCell emitterCell]; 
     fire.birthRate = 0; 
     fire.lifetime = 1.5; 
     fire.lifetimeRange = 0.3; 
     fire.color = [[UIColor colorWithRed:255 green:255 blue:255 alpha:0.1] CGColor]; 
     fire.contents = (id)[[UIImage imageNamed:@"Particles_fire.png"] CGImage]; 
     [fire setName:@"fire"]; 

     fire.velocity =5; 
     fire.velocityRange = 20; 
     fire.emissionRange = M_PI_2; 

     fire.scaleSpeed = 0.1; 
     fire.spin = 0.5; 

     fireEmitter.renderMode = kCAEmitterLayerAdditive; 

     //add the cell to the layer and we're done 
     fireEmitter.emitterCells = [NSArray arrayWithObject:fire]; 

    } 

    + (Class) layerClass //3 
    { 
     //configure the UIView to have emitter layer 
     return [CAEmitterLayer class]; 
    } 

    -(void)setEmitterPositionFromTouch: (CGPoint*)t 
    { 
     //change the emitter's position 
     fireEmitter.emitterPosition = (*t); 
    } 

    -(void)setIsEmitting:(BOOL)isEmitting 
    { 
     //turn on/off the emitting of particles 
     [fireEmitter setValue:[NSNumber numberWithInt:isEmitting?100:0] forKeyPath:@"emitterCells.fire.birthRate"]; 
    } 


    @end 

मैं के लिए एक कस्टम दृश्य बना सकते हैं और पार्टी का उत्सर्जन के लिए इस कोड का इस्तेमाल किया स्पर्श

यहाँ पर cles स्पर्श

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint p = [[touches anyObject] locationInView:self.view]; 
    [fireView setEmitterPositionFromTouch: &p]; 
    [fireView setIsEmitting:YES]; 

} 

पर कण के उत्सर्जन के लिए कॉल बयान है यह आप के लिए काम करेंगे हो सकता है।

4

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मुझे यह समस्या भी थी। Jackslash यह अच्छी तरह से जवाब देती है इस पोस्ट में: iOS 7 CAEmitterLayer spawning particles inappropriately

आप (CACurrentMediaTime साथ वर्तमान समय पर शुरू करने के लिए अपने emitter परत पर beginTime स्थापित करने के लिए) की जरूरत है। ऐसा लगता है कि हमारे पास ऐसी समस्या है क्योंकि उत्सर्जन पहले से ही शुरू हुआ था।

emitter.beginTime = CACurrentMediaTime(); 

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

  • कोई संबंधित समस्या नहीं^_^