2013-03-26 162 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; //它会恢复你的纺纱和下降的精灵,而按钮可压如暂停比赛中。