如何在cocos2d中暂停游戏?

时间:2013-03-26 20:59:18

标签: objective-c cocos2d-iphone

我知道这个问题之前已经被问过和回答,但没有一个答案似乎符合我的要求。我需要能够暂停动画,但仍然可以让我的暂停菜单出现并询问用户输入。这是可能的,如果可以的话,我该怎么做呢。

9 个答案:

答案 0 :(得分:7)

pause为此目的有resumeCCDirector两种方法:

[[CCDirector sharedDirector] pause];

[[CCDirector sharedDirector] resume];

来自文档:

  

将绘制运行场景,但所有预定计时器将暂停,暂停时,绘制速率将为4 FPS以减少CPU消耗

答案 1 :(得分:4)

我建议你推送 cocos2d场景堆栈中的“暂停场景”。

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

这将自动暂停当前场景(我假设是水平场景)并运行“暂停场景”,以便用户可以与之交互。

非常重要要记住,在执行了上述说明之后,你将在cocos2d的场景堆栈中有2个场景(关卡场景[冻结] +暂停场景[运行] )。

因此,一旦您进入“暂停场景”,如果您想要恢复级别,您只需弹出来自堆栈的暂停场景。

[[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"

答案 2 :(得分:1)

我尝试了所有的建议,但没有一个在我的情况下工作,所以这就是我最终做的,对我来说非常好。这是暂停。

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

}

这要恢复:

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

        }

答案 3 :(得分:1)

使用Cocos 2D Version 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

希望这有帮助。

答案 4 :(得分:0)

停止只是动画?

[ [ CCDirector sharedDirector ] stopAnimation ];

[ [ CCDirector sharedDirector ] startAnimation ];

如果您想要停止所有内容,请按照您在其他任何地方看到的内容进行暂停(在菜单移动到位后),然后在用户触摸某个内容后取消暂停。

答案 5 :(得分:0)

我是cocos2D的新手并使用了单独的游戏循环(而不是scheduleupdate),并且将其与一些更多的调度程序一起取消调度。它将自动暂停游戏,同时我在游戏层的顶部放置一个新层(即Pauselayer)。 看起来很复杂,但对我有用。

答案 6 :(得分: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];

答案 7 :(得分:0)

试试这个PauseButton类https://github.com/iabtyagi/custom-pause-cocos2d。 完全符合您的要求。

答案 8 :(得分:0)

CCPhysicsNode * _physics;

_physics.paused = true; //它会暂停你的游戏而不是动作。

_physics.paused = false; //在暂停游戏期间按钮可按下时,它将恢复精灵的旋转和下降。