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 秒。现在,我希望我的暂停方法冻结粒子系统,这样当我取消暂停时,粒子发射器会从它停止的地方继续。

我现在遇到的问题是,当我暂停时,粒子发射器会继续。“pauseSchedulerAndActions()”方法与粒子发射器分离,据我所知,粒子发射器有自己的调度器。

无论我尝试什么,我都无法阻止粒子发射器继续在 p_emitter.setDuration() 方法中设置的时间移动。

这是有问题的,因为如果我在粒子发射器尚未达到其持续时间时暂停,那么当我取消暂停时,持续时间已到并且它已被删除,因为我设置了这个标志:

p_emitter->setAutoRemoveOnFinish(true);

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

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

4

1 回答 1

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();
于 2013-03-25T01:40:47.733 回答