既存の一時停止、再開、再起動フレームワークにパーティクル エミッターを実装する方法について質問があります。
現在、次のコードを含む一時停止メソッドがあります。
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);
エミッタを作成するとき。また、エミッターが実際に一時停止することはないため、ゲームが実際に一時停止していないような印象を与えます。
私の質問は、一時停止を解除したときにエミッタが再開できるように、パーティクルエミッタを完全にフリーズするにはどうすればよいですか?