SKEmitterNode を使用して、タップ時にいくつかのパーティクルを放出しています。Periscope のハートに似た効果を求めています。
エミッターを追加すると、「オン」になったように動作しないことがわかりました。つまり、パーティクルは、スポーン ポイントから離れた場所にフル アルファで表示されます (あたかもしばらく生きていたかのように)。エミッターが実行されているかのように、突然表示されました。
私が求めているのは、タップ -> ノードの追加 -> ポイントからの放射の開始 -> しばらくの間の放射 -> 停止 -> ノードの削除です。
GCDを使用してparticleBirthRateを調整してみました:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
if(self.burstEmitter.parent){
return;
}
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInNode:self];
self.burstEmitter.position = point;
self.burstEmitter.particleBirthRate = 0;
[self addChild:self.burstEmitter];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.burstEmitter.particleBirthRate = 10;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.burstEmitter.particleBirthRate = 0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self removeAllChildren];
});
});
});
}
次に、SKActionが適切なツールである可能性があります(おそらく...)
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
if(self.burstEmitter.parent){
return;
}
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInNode:self];
self.burstEmitter.position = point;
self.burstEmitter.particleBirthRate = 10;
[self addChild:self.burstEmitter];
[self.burstEmitter runAction:[SKAction sequence:@[
[SKAction fadeInWithDuration:1],
[SKAction waitForDuration:2],
[SKAction fadeOutWithDuration:1],
[SKAction removeFromParent]
]]];
}
これは明らかにエミッタ ノードをフェード アウトさせますが、「シャット オフ」するのではありません。
私は CAEmitterLayer を使用することにオープンです。私もそれを試しましたが、同じ問題に遭遇しました。
更新: 解決策が 1 つ見つかりました: resetSimulation です。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
if(self.burstEmitter.parent){
return;
}
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInNode:self];
self.burstEmitter.position = point;
self.burstEmitter.particleBirthRate = 10;
[self.burstEmitter resetSimulation];
[self addChild:self.burstEmitter];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.burstEmitter.particleBirthRate = 0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self removeAllChildren];
});
});
}
これは私が求めていたものを達成します。可能であれば、これに SKAction を使用したいと思っています。