1

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 を使用したいと思っています。

4

2 に答える 2

1

SKAction ブロックを使用できます。あなたが求めていることを達成する方法はたくさんあります。ここに簡単なものがあります:

SKAction *wait0 = [SKAction waitForDuration:0.5]; // time in secs
SKAction *block0 = [SKAction runBlock:^{
    self.burstEmitter.particleBirthRate = 9;
}];
SKAction *block1 = [SKAction runBlock:^{
    self.burstEmitter.particleBirthRate = 8;
}];
SKAction *block2 = [SKAction runBlock:^{
    self.burstEmitter.particleBirthRate = 7;
}];

// and so on...

[self runAction:[SKAction sequence:@[block0, wait0, block1, wait0, block2]]];
于 2015-05-28T18:24:18.947 に答える
1

SKKeyframeSequence を使用します。それがそのためです。

SKEmitterNode ドキュメント ページの「キーフレーム シーケンスを使用してパーティクル プロパティのカスタム ランプを構成する」の説明を参照してください。

于 2015-05-28T18:31:29.290 に答える