Cocos2d / Cocos2d-x粒子系统暂停

时间:2013-03-24 21:36:06

标签: c++ iphone cocos2d-iphone cocos2d-x particle-system

我有一个关于如何将粒子发射器实现为预先存在的暂停,恢复和重启框架的问题。

现在我有一个包含此代码的暂停方法:

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);

创建发射器时。此外,发射器实际上从未暂停,因此它给人的印象是游戏实际上没有暂停。

所以我的问题是,如何以一种允许发射器在我取消暂停时恢复的方式完全冻结粒子发射器?

1 个答案:

答案 0 :(得分:1)

对我而言,这看起来像是一个愚蠢的错误!

在这段代码中你可以看到我在应该拥有之前设置了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();