0

既存の一時停止、再開、再起動フレームワークにパーティクル エミッターを実装する方法について質問があります。

現在、次のコードを含む一時停止メソッドがあります。

void GamePlayLayer::pause()
{
    //pauses/resumes game mechanics
    if(!isPaused){
        pauseSchedulerAndActions();
        isPaused = true;
        cout << "\npaused game... isPaused = " << isPaused;
    }else{
        resume();
    }

    //pauses/resumes particle emitters
    CCParticleSystemQuad* runner_emitter = runner.getExistingEmitter();
    if(runner_emitter != NULL){
        if(!isPaused){
            runner_emitter->pauseSchedulerAndActions();
        }else{
            runner_emitter->resumeSchedulerAndActions();
        }
    }
}

また、次のように作成されたパーティクル エミッターもあります。

CCParticleSystemQuad* Runner::getNewEmitter()
{
    p_emitter = CCParticleSystemQuad::create("emitter_runner.plist");

    //position is relative to the point we add it to -- use this so it follows the sprite when the runner moves
    p_emitter->setPositionType(kCCPositionTypeRelative);

    updateEmitterPosition();

    p_emitter->retain();
    //so we dont get extra emitters sticking around in the scene
    p_emitter->setAutoRemoveOnFinish(true);
    cout <<endl << "Emitter sent";
    return p_emitter;
}

問題のパーティクル エミッターには持続時間が関連付けられており、たとえば 2 秒とします。現時点では、pause メソッドでパーティクル システムをフリーズして、一時停止を解除したときにパーティクル エミッターが中断したところから継続するようにしたいと考えています。

私が今直面している問題は、一時停止するとパーティクル エミッターが継続することです。「pauseSchedulerAndActions()」メソッドは、独自のスケジューラを持っていることを理解しているパーティクル エミッタから分離されています。

何を試しても、パーティクル エミッタが p_emitter.setDuration() メソッドで設定された時間だけ移動し続けるのを止めることはできません。

パーティクル エミッターがまだ持続時間に達していないときに一時停止すると、一時停止を解除するまでに持続時間が終了し、このフラグを設定したために削除されてしまうため、これは問題です。

p_emitter->setAutoRemoveOnFinish(true);

エミッタを作成するとき。また、エミッターが実際に一時停止することはないため、ゲームが実際に一時停止していないような印象を与えます。

私の質問は、一時停止を解除したときにエミッタが再開できるように、パーティクルエミッタを完全にフリーズするにはどうすればよいですか?

4

1 に答える 1

1

私の愚かな間違いのように見えます!

このコード ブロックでは、必要な前に isPaused を設定していることがわかります。これにより、2 番目の if ステートメントが入力されるべきときに入力されなくなりました。

//pauses/resumes game mechanics
if(!isPaused){
    pauseSchedulerAndActions();
    isPaused = true;  <-- prematurely set to true
    cout << "\npaused game... isPaused = " << isPaused;
}else{
    resume();
}

//pauses/resumes particle emitters
CCParticleSystemQuad* runner_emitter = runner.getExistingEmitter();
if(runner_emitter != NULL){
    if(!isPaused){  <-- still expected isPaused = false
        runner_emitter->pauseSchedulerAndActions();
于 2013-03-25T01:40:47.733 に答える