2013-03-26 76 views
3

我知道這個問題已被問及之前的答案,但沒有一個答案似乎符合我想要做的。我需要能夠暫停動畫,但仍然可以讓我的暫停菜單出現並詢問用戶輸入。這是可能的,如果是這樣,我該怎麼做。如何在cocos2d中暫停遊戲?

回答

1

我嘗試了所有的建議,但沒有一個在我的情況下工作,所以這就是我最終做的工作,對我來說非常合適。這是暫停。

[self pauseSchedulerAndActions]; 
for (CCNode *child in [self children]) { 
    [child pauseSchedulerAndActions]; 

} 

而這個恢復:

 [selfReference resumeSchedulerAndActions]; 
     for (CCNode *child in [selfReference children]) { 
      [child resumeSchedulerAndActions]; 

     } 
0

停止只是動畫?

[ [ CCDirector sharedDirector ] stopAnimation ]; 

[ [ CCDirector sharedDirector ] startAnimation ]; 

如果要停止一切,暫停一下,因爲你已經看到了做其他任何地方(菜單已被移動到位後),則取消暫停,一旦用戶觸摸某一件事。

7

有兩種方法pauseresume爲此,在CCDirector

[[CCDirector sharedDirector] pause]; 

[[CCDirector sharedDirector] resume]; 

從文檔:

正在運行的場景將被drawed但所有計劃的計時器將暫停,暫停時,提款率將爲4 FPS,以減少CPU消耗

0

我是新來的cocos2D和使用單獨的遊戲循環(而不是scheduleupdate),並與其他一些調度程序一起未調度。它會自動暫停遊戲,同時我在遊戲玩家的頂部放置一個新圖層(即Pauselayer)。 顯得相當複雜,但爲我工作。

4

我建議你 「暫停的場景」 的cocos2d的現場堆棧。

CCScene * pauseScene = ...; 
[[CCDirector sharedDirector] pushScene:pauseScene]; 

這會自動暫停當前場景(我假設是水平的場景),並運行「暫停場景」,使用戶可以與它進行交互。

這是非常重要要記住上面的指令被執行後,你將有2個場景在cocos2d的場景棧(水平場面[凍結] +暫停現場[運行])。

所以,一旦你在「暫停場景」,如果你想簡歷水平,你只需要流行從堆棧中暫停的場景。

[[CCDirector sharedDirector] popScene]; 

這將自動刪除「暫停場景」並恢復堆棧(這是關卡場景)中的前一場景。

請記住,您總是需要在某個時間「彈出」暫停場景。重要的是不要忘記「級別場景」仍然在cocos2d的場景堆棧中!

例如:如果在「暫停場景」你有一個按鈕加載水平選擇菜單,永遠離開目前的水平,你應該實現它如下:

CCScene * levelSelector = ... 
[[CCDirector sharedDirector] popScene]; // to remove the "pause scene" from the stack 
[[CCDirector sharedDirector] replaceScene:levelSelector]; // replace the "level scene" with the "levelSelector scene" 
0

我用:

@interface CCNode (PauseAdded) 

@end 


@implementation CCNode (PauseAdded) 


-(void) traversePause 
{ 
    CCNode* a = [children_ lastObject]; 

    CCARRAY_FOREACH(children_, a) 
    { 
     [scheduler_ pauseTarget:a]; 
     [actionManager_ pauseTarget:a]; 
     [a traversePause]; 
    } 

    [scheduler_ pauseTarget:self]; 
    [actionManager_ pauseTarget:self]; 
} 


-(void) traverseResume 
{ 
    CCNode* a = [children_ lastObject]; 

    CCARRAY_FOREACH(children_, a) 
    { 
     [a traverseResume]; 
     [scheduler_ resumeTarget:a]; 
     [actionManager_ resumeTarget:a]; 
    } 

    [scheduler_ resumeTarget:self]; 
    [actionManager_ resumeTarget:self]; 
} 

@end 

這樣,你可以做這樣的事情假設你的遊戲層從休止層分離:

[scene.game_layer traversePause]; 

而取消暫停:

[scene.game_layer traverseResume]; 
1

隨着Cocos 2D版本2的行動管理器不再是一個單身人士。而是代碼已經與CCDirector融合。

所以這是暫停在特定的場景中所有的行動,並恢復他們以及方式。

-(void)pauseGamePlayScene{ 
    for(CCSprite *sprite in [self children]) { 
     [[[CCDirector sharedDirector] actionManager]pauseTarget:sprite]; 
    } 
} 

-(void)resumeGamePlayScene{ 
    for(CCSprite *sprite in [self children]) { 
     [[[CCDirector sharedDirector] actionManager]resumeTarget:sprite]; 
    } 
} 

Cocos 2d Ver 2 Action Manager Documentation

希望這有助於。

0

CCPhysicsNode * _physics;

_physics.paused = TRUE; //將暫停遊戲,但沒有行動。

_physics.paused = FALSE; //它會恢復你的紡紗和下降的精靈,而按鈕可壓如暫停比賽中。