2013-03-24 59 views
0

我有一個關於如何在預先存在的暫停,恢復和重新啓動框架中實現粒子發射器的問題。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); 

時創建發射器。此外,發射器從來沒有實際停頓,所以它給人的印象是遊戲實際上並沒有停頓。

所以我的問題是,我如何完全凍結粒子發射器的方式,允許發射器恢復時,我不停頓?

回答

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