3

私は、CCQuadParticleSystemを利用して点滅する星を作成する、スペースの背景を持つcocos2dベースのアプリを開発しています。このパーティクルシステムはParticleDesignerで生成しました。パーティクルシステムをロードするとすぐに、星を表す白い点が背景に表示され始め、しばらくするとフェードアウトして、パーティクルシステムがレジーム状態に達する数秒後に、星でいっぱいの夜空が出てきます。

私の問題は、パーティクルシステムを将来の特定の時間(たとえば、t0 = 3秒)から開始して、すべての開始が点滅するのを待つ必要がないようにする方法があるかどうかを知りたいということです。

問題を明確に説明できたと思います

前もって感謝します

アンドレア

4

5 に答える 5

7

私はこれを行いましたが、それはまさに私が望んでいた方法で機能しました。

for (int i = 0 ; i < 300 ; i++)
    [emitter update:.1];
于 2012-12-10T22:39:28.167 に答える
2

あなたは試しましたか

id actions = [CCSequence actions:[CCDelayTime actionWithDuration:3.0f],
              [CCCallFunc actionWithTarget:self selector:@selector(onStallComplete)],
              nil];
[self runAction:actions];

確かに、API の元の意図を悪用している可能性がありますが、
そのような遅延反応が複数ある場合は、onStallComplete での再入可能性を監視するのに役立ちます。

注:SOの初心者、コードスニペットが正しく見えることを願っています

于 2011-09-03T16:52:46.577 に答える
0

これを直接実装する方法は考えられませんが、回避策としてこのようなものを試してみてください。他のエラーのため、まだこれをテストできていないのではないかと思いますが、作業中です。

{ 
    ...

    //This attempts to make 3 seconds pass 100 times quicker
    [[CCScheduler sharedScheduler] setTimeScale:100];
    [self schedule:@selector(cancelIncreasedTimeScale) interval:3];

    ...
}


int numberOfTimesCancelled = 0;
-(void) cancelIncreasedTimeScale
{
    numberOfTimesCancelled ++;
    //Two because the scheduler is also called straight away? Remove if it's only called after waiting an initial (3/100) seconds
    if (numberOfTimesCancelled == 2) {
        [self unschedule:@selector(cancelIncreasedTimeScale)];
        [[CCScheduler sharedScheduler] setTimeScale:1];
    }
}

私が心配している問題は、シーンの他のアイテムも100倍速く実行されることです。それは問題ですか?

于 2011-09-03T08:51:33.167 に答える
0

updateWithDelta:パーティクルを更新するために、ゲームループで何らかのメソッドを使用していると思います。特定の間隔の後にパーティクルを開始する場合は、独自のタイマーを作成します。

編集:以下のコメントに基づいて、私の方法はまだ良いですが、微調整が必​​要です. updateWithDelta:パーティクル システムのメソッドで条件を削除するだけですそうすれば、3秒間は更新されますが、レンダリングされないため、説明したように見えます.

.h ファイル内:

BOOL particleShouldUpdate;
float particleTimer;

あなたのinit方法では:

particleShouldRender = NO;
particleTimer = 3.0f;

あなたのupdateWithDelta:方法では:

if(!particleShouldRender){
  particleTimer -= delta;
  if(particleTimer < 0){
    particleShouldRender = YES;
  }
}
// update your particle.

最後に、render メソッドで次のようにします。

if(particleShouldRender){
  // render your particle.
}

この時点から、レンダリングを停止したい場合は、initメソッドのように 2 つの変数をリセットするだけで、同じ効果が発生することに注意してください。

EDIT2:initさらに明確にするために、粒子の方法を適応させるだけここでは 2 つの仮定を行いますが、ニーズに合わせてわずかに変更するだけで済みます。更新サイクルが毎秒 60 フレームで、パーティクルの最小寿命が 1.01 で、ゲームを開始する前に 3 秒間の更新が必要であるとします。次に、initメソッドで次を試し

for(float delta = 0.0f; delta < 3.0f; delta += (1/60)){
  [particle updateWithDelta:(float)(1/60)];
}

これにより、通常のようにパーティクルが更新されますが、各間隔でレンダリングされることはなく、他のものが更新される前に行われます。または、パーティクルを更新する際の速度が心配な場合は、次のことを試してください。

for(int i = 0; i < 3; i++){
  [particle updateWithDelta:1];
  [particle updateWithDelta:0.02];
}

これにより高速になりますが、パーティクル パラメータによってはいくつかの問題が発生する可能性があります。

EDIT3:これをさらに調べると、cocos2D では何らかの理由でこれを行うことができません。これと同様の質問をオンラインで見つけましたposVarspeedを十分に大きくして、シーンに完全に移行したら、値を通常の値にリセットすることを提案しました。あなたはそれを試してみたいかもしれません!

それが役立つことを願っています!

于 2011-09-04T08:01:07.393 に答える
0

パーティクル システムを 3 秒先に早送りする方法はないと思います。または、状況に応じて 2 つの異なる解決策を想像できます。

  1. 別のシーン (空の黒いシーンなど) の背後にあるパーティクルを使用してシーンをロードします。3 秒後、見栄えの良いパーティクル エフェクトのシーンに切り替わります。これは、ユーザーが 3 秒間待つ必要があり、すべてがまとまっている間だけ粒子システムを見られたくない場合や、粒子システムのあるシーンの前に別のシーンがある場合に問題ありません。
  2. パーティクル システムを記録し、ファイルに保存してから、シーンで再生します。記録とは、各パーティクルの位置と色を保存することです。欠点は、毎回同じように見えることです。記録したものよりも長く実行したい場合は、ループで再生しても見栄えが良いことを確認する必要があります。
于 2011-09-02T20:49:52.000 に答える