gpt4 book ai didi

objective-c - CAEmitterLayer 在触摸事件中随机发射不需要的粒子

转载 作者:IT老高 更新时间:2023-10-28 11:47:02 24 4
gpt4 key购买 nike

我正在尝试设置一个 CAEmitterLayer 来制作五彩纸屑效果,我遇到了两个问题:

  1. 每当我将单元格上的 birthRate 设置为非零值以启动动画时,我都会在屏幕上随机放置一系列单元格,这些单元格可以正常动画,然后发射器继续正常发射之后。
  2. 每当 emitterCells 在屏幕上绘制东西时,只要我触摸屏幕,发射器就会在(看似)存在的随机位置(看似)中绘制 emitterCells随机时间。发射器中的任何内容都与任何触摸事件无关(即我不是故意在触摸事件上绘制任何东西),但该层位于具有多个嵌入式 View 的 View 中。我触摸的次数越多,显示的单元格就越多。

这是我设置发射器的代码,然后启动和停止它(一旦我调用了停止函数,然后点击屏幕停止创建新的随机元素):

- (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 添加到不同的 View ,禁用该 View 上的用户交互,然后将其添加为主视图的 subview ,但这似乎不起作用。

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

谢谢,山姆

最佳答案

我知道这是一篇旧帖子,但我也遇到了这个问题。Jackslash 在这篇文章中很好地回答了这个问题: iOS 7 CAEmitterLayer spawning particles inappropriately

您需要使用 CACurrentMediaTime() 将发射器层上的 beginTime 设置为从当前时间开始。看来我们遇到的问题是因为发射器已经在过去启动了。

emitter.beginTime = CACurrentMediaTime();

关于objective-c - CAEmitterLayer 在触摸事件中随机发射不需要的粒子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com