CAEmitterLayer发出触摸事件随机所欲粒子

问题描述:

我试图建立一个CAEmitterLayer做出纸屑效果,我碰到两个问题:CAEmitterLayer发出触摸事件随机所欲粒子

  1. 每当我设置我的细胞birthRate到一些非零的动画开始我会在屏幕上随机放置一些细胞,这会正常生成动画,然后发射器会继续正确地发射。
  2. 每当emitterCells正在屏幕上绘制东西时,无论何时我触摸屏幕,发射器都会在(看似)随机的位置绘制emitterCells(随机时间)。发射器中没有任何东西与任何触摸事件相关联(即,我不是故意在触摸事件上绘制任何东西),但该图层位于具有多个嵌入视图的视图中。我触摸的越多,出现的细胞就越多。

这是我设立的发射器,然后启动和停止它的代码(一旦我叫停止功能,然后轻敲屏幕停火创造新的随机因素):

- (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"]; 
} 

再一次,一旦开始,随机元素的初始乱舞后,这工作得很好:一切动画正常,并且当birthRate后来设置为零时,它会优雅地结束。它似乎只是对触摸事件做出响应,我不知道为什么。我已经尝试将emitterLayer添加到不同的视图,禁用该视图上的用户交互,然后将其添加为主视图的子视图,而这似乎不起作用。

任何帮助/见解将不胜感激!

感谢, 山姆

+4

您是否发现此事?我也有同样的问题。看起来像是一个非常不必要的“功能”给我。 – 2012-08-16 00:16:24

+4

也许在这篇文章的最后一篇评论之后的一年后,有人找到了这个问题的解决方案?我在使用CAEmitterLayer类的网络中创建的每个项目中都会看到此问题。你甚至可以试试这个教程:http://www.raywenderlich.com/6063/uikit-particle-systems-in-ios-5-tutorial。例如,从vc中删除触摸处理,并将birthRate降低到1,然后在任何地方开始录制。点击后所有活颗粒似乎都会增加一倍。该问题只出现在设备上,而不是模拟器中。 – 2013-05-29 21:01:13

难道你不检查,看看是否粒子发射像Wenderlich例如阿图尔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"]; 
} 

h文件

#import <UIKit/UIKit.h> 

    @interface DWFParticleView : UIView 

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

    @end 

.m文件

#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 

我使用此代码为创建自定义视图和发射杂色在 触摸

这里克莱斯是颗粒的排放调用语句上的触摸

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

} 

可能是它会为你工作。

我知道这是一个旧的帖子,但我也有这个问题。 Jackslash回答得好在这个岗位: iOS 7 CAEmitterLayer spawning particles inappropriately

你需要设置你的BEGINTIME发射层上在当前时间与CACurrentMediaTime开始()。看起来我们遇到了问题,因为过去已经开始发射。

emitter.beginTime = CACurrentMediaTime();