Пауза системы частиц Cocos2d / Cocos2d-x

У меня есть вопрос о том, как внедрить эмиттер частиц в уже существующую структуру паузы, возобновления и перезапуска.

Прямо сейчас у меня есть метод паузы, который включает этот код:

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 секунды. Прямо сейчас я хочу, чтобы мой метод паузы заморозил систему частиц так, чтобы, когда я делаю паузу, эмиттер частиц продолжал там, где он остановился.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что, когда я делаю паузу, излучатель частиц продолжает работать. Метод pauseSchedulerAndActions () отделен от эмиттера частиц, который, как я понимаю, имеет свой собственный планировщик.

Независимо от того, что я пытаюсь сделать, я не могу помешать эмиттеру частиц продолжать движение в течение времени, установленного в методе p_emitter.setDuration ().

Это проблематично, потому что, если я сделаю паузу, когда эмиттер частиц еще не достиг своей продолжительности, к тому времени, когда я отменю паузу, длительность истечет, и она будет удалена, потому что я установил этот флаг:

p_emitter->setAutoRemoveOnFinish(true);

при создании излучателя. Кроме того, излучатель никогда не делает паузу, поэтому создается впечатление, что игра не делает паузу.

Итак, мой вопрос: как мне полностью заморозить излучатель частиц таким образом, чтобы позволить излучателю возобновить работу, когда я делаю паузу?

0

Решение

Похоже, глупая ошибка с моей стороны!

В этом блоке кода вы можете видеть, что я установил isPaused до того, как должен был. Это предотвратило ввод второго оператора 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();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]