2013-05-25 16 views
7

ユーザーが画面に触れている間だけ発光するパーティクルエフェクトを作成したいと思いますが、CAEmitterCell birthRateプロパティを変更することはできません。CAEmitterCellはbirthRateの変更を尊重していません

私は自分のCAEmitterLayerと私のCAEmitterCellを設定するUIViewのサブクラスを持っています。そのログレポートを

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint tappedPt = [touch locationInView:touch.view]; 
    NSLog(@"began x:%f y:%f",tappedPt.x, tappedPt.y); 
    emitterView.emitterCell.birthRate = 42; 
    emitterView.emitterLayer.emitterPosition = tappedPt; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint tappedPt = [touch locationInView:touch.view]; 
    NSLog(@"moved x:%f y:%f",tappedPt.x, tappedPt.y); 
    emitterView.emitterLayer.emitterPosition = tappedPt; 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    NSLog(@"ending %f", emitterView.emitterCell.birthRate); 
    emitterView.emitterCell.birthRate = 0.00; 
    NSLog(@"ended %f", emitterView.emitterCell.birthRate); 
} 

:次に

@property (strong, nonatomic) CAEmitterLayer *emitterLayer; 
@property (strong, nonatomic) CAEmitterCell *emitterCell; 

、私のビューコントローラでは、私がemitterLayer、およびemitterCellの出生率の位置を設定するタッチし、追跡しています:私は、そのクラスに2つのプロパティを定義していますemitterView.emitterCell.birthRateの変更:私は画面をタッチすると予想されるように、エミッタが開始

began x:402.000000 y:398.500000 
ending 42.000000 
ended 0.000000 

Iタッチを終了するとき、層は、EMITをタッチに従うが、 terセルは、最初に設定された値(touchesBeganで設定された値)にかかわらず、喜んで放出します。私が何をしても、出生率の値を一度変更することができないようでは、一度ゼロ以外の値に設定されます。ログは、値が正しく設定されているが、エミッターは発光し続けると報告します。

しかし、私はレイヤーの位置を変更するためにtouchesEnded方法を変更した場合、私はemitterCellに出生率を設定した後、予想通り、その後、すべての作品:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint tappedPt = [touch locationInView:touch.view]; 
    NSLog(@"began x:%f y:%f",tappedPt.x, tappedPt.y); 

    NSLog(@"ending %f", emitterView.emitterCell.birthRate); 
    emitterView.emitterCell.birthRate = 0.0; 
    NSLog(@"ended %f", emitterView.emitterCell.birthRate); 
    emitterView.emitterLayer.emitterPosition = tappedPt; 
} 

誰かが理由を説明していただけますか?

+0

あなたがこれを理解しましたか? – scott

答えて

6

私はそれは少し奇妙な動作しているなぜ知らないが、私は、キー値コーディングを使用しても問題が解決し、セルが発光を停止することが判明:

はあなたのCAEmitterLayerは「yourEmitterLayer」であり、あなたが持っていると仮定すると、 touchesEnded内部に配置された場合は、「yourEmitterCell」と命名されCAEmitterCellが、これは放射を停止します。

[yourEmitterLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"emitterCells.yourEmitterCell.birthRate"]; 
+0

2つの質問:1)birthRateは浮動小数点で、intを代入しています。 2)エミッタの操作は常にそのエミッタから開始する必要がありますか?つまり、この場合、エミッタを呼び出して、 'emitterCells.yourEmitterCell.birthRate'というパスを渡しますが、emitterCell自体への参照があるとします。単に[self.emiterCell .... forKeyPath:@ "birthRate"] 'を実行することはできますか? – SpaceDog

+0

私は上記のコメント者の質問 –

+0

の答えを知りたいと思います。このコードを操作するには、各エミッタセルのnameプロパティを設定する必要があります self.yourEmitterCell.name = @ "yourEmitterCell"、 – Anees

2

を使用すると、0にCAEmitterLayerインスタンスのbirthRateプロパティを設定する必要が粒子を放出停止するには、それが最初にセットしたものの、インスタンス...理由はわかりませんが、動作します。

スウィフト3例:

func emitParticles() { 
    let particlesEmitter = CAEmitterLayer() 
    particlesEmitter.emitterPosition = center 
    particlesEmitter.emitterShape = kCAEmitterLayerCircle 
    particlesEmitter.emitterSize = CGSize(width: 50, height: 50) 
    particlesEmitter.renderMode = kCAEmitterLayerAdditive 

    let cell = CAEmitterCell() 
    cell.birthRate = 15 
    cell.lifetime = 1.0 
    cell.color = bubble.color.cgColor 
    cell.velocity = 150 
    cell.velocityRange = 50 
    cell.emissionRange = .pi 
    cell.scale = 0.1 
    cell.scaleSpeed = -0.1 

    cell.contents = UIImage(named: "particle")?.cgImage 
    particlesEmitter.emitterCells = [cell] 

    layer.addSublayer(particlesEmitter) 

    DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 
     particlesEmitter.birthRate = 0 
    } 
} 
関連する問題