私は CAEmitterLayer をいじっていますが、現在いくつかの問題に直面しています :(
たとえば、ヒットや爆発のような短いパーティクル効果が必要です (したがって、この場所に小さな UIView があります)。どうすればいいですか?
1、私にはアイデアがありました - パーティクルでエミッターレイヤーを作成し、lifeTime を 0 に設定します。必要なときは、たとえば lifeTime を 1 に設定し、しばらくしてから 0 に戻すことができます。 - しかし、何もしていません。 :(
2、2番目のアイデアは、必要なたびに[CAEmitterLayerレイヤー]を作成し、レイヤーサブレイヤーとして追加することでした。しかし、たとえば10回繰り返すとどうなるか考えています.10のサブレイヤーがあり、1つのアクティブと9つの「デッド」がありますか? 一般的に放出を停止するには?しばらくしてからライフタイムを0に設定し、他のセレクターをremoveFromSuperlayerに設定するためにperformSelectorを持っています...しかし、それは私が望むほどきれいではありません:(別の「適切な」方法はありますか?
サブレイヤーが多すぎるのは、別の問題に関連していると思います... パーティクルを 1 つだけ放出したいのです。そして、私がそれを行うと、それは機能します。しかし、3 つの粒子を放出することもあれば、2 つの粒子を放出することもあります。エミッターを停止しないと、毎回正しい数のパーティクルが与えられます...
質問は…</p>
パーティクルを短時間放出する方法。それらの操作方法 - 停止、親レイヤーからの削除など、正確な数のパーティクルを放出する方法
編集:
emitter = [CAEmitterLayer layer];
emitter.emitterPosition = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2);
emitter.emitterMode = kCAEmitterLayerPoints;
emitter.emitterShape = kCAEmitterLayerPoint;
emitter.renderMode = kCAEmitterLayerOldestFirst;
emitter.lifetime = 0;
particle = [CAEmitterCell emitterCell];
[particle setName:@"hit"];
particle.birthRate = 1;
particle.emissionLongitude = 3*M_PI_2;//270deg
particle.lifetime = 0.75;
particle.lifetimeRange = 0;
particle.velocity = 110;
particle.velocityRange = 20;
particle.emissionRange = M_PI_2;//PI/2 = 90degrees
particle.yAcceleration = 200;
particle.contents = (id) [[UIImage imageNamed:@"50"] CGImage];
particle.scale = 1.0;
particle.scaleSpeed = -0.5;
particle.alphaSpeed = -1.0;
emitter.emitterCells = [NSArray arrayWithObject:particle];
[(CAEmitterLayer *)self.view.layer addSublayer: emitter];
次に、ボタンにリンクされたメソッドでこれを行います:
emitter.lifetime = 1.0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.9 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
emitter.lifetime = 0;
});
@David Rönnqvistの態度に変更した後、編集および更新
CAEmitterCell *dustCell = [CAEmitterCell emitterCell];
[dustCell setBirthRate:1];
[dustCell setLifetime:1.5];
[dustCell setName:@"dust"];
[dustCell setContents:(id) [[UIImage imageNamed:@"smoke"] CGImage]];
[dustCell setVelocity:50];
[dustCell setEmissionRange:M_PI];
// Various configurations for the appearance...
// This is the only cell with configured scale,
// color, content, emissionLongitude, etc...
[emitter setEmitterCells:[NSArray arrayWithObject:dustCell]];
[(CAEmitterLayer *)self.view.layer addSublayer:emitter];
// After one burst, change the birth rate of the cloud to 0
// so that there is only one burst per side.
double delayInSeconds = 0.5; // One cloud will have been created by now, but not two
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {
[emitter setLifetime:0.0];
[emitter setValue:[NSNumber numberWithFloat:0.0]
forKeyPath:@"emitterCells.dust.birthRate"];
});