3

我知道这个问题之前已经被问过并得到了回答,但似乎没有一个答案适合我想要做的事情。我需要能够暂停动画,但仍然能够让我的暂停菜单出现并要求用户输入。这可能吗?如果可以,我该怎么做。

4

9 回答 9

7

有两种方法pauseresume为此目的CCDirector

[[CCDirector sharedDirector] pause];

[[CCDirector sharedDirector] resume];

从文档中:

正在运行的场景将被绘制,但所有计划的计时器将被暂停暂停时,绘制速率将为 4 FPS,以减少 CPU 消耗

于 2013-03-27T10:24:34.887 回答
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"
于 2013-04-12T14:37:28.923 回答
1

我尝试了所有的建议,但没有一个对我有用,所以这就是我最终做的对我来说非常有效的方法。这是暂停。

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

}

这要恢复:

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

        }
于 2013-03-27T14:50:08.993 回答
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 动作管理器文档

希望这可以帮助。

于 2013-09-12T05:11:53.733 回答
0

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

于 2013-07-22T17:56:37.410 回答
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];
于 2013-07-18T17:17:09.287 回答
0

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

于 2013-03-27T13:14:00.443 回答
0

CCPhysicsNode *_physics;

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

_physics.paused = false;// 当按钮像在暂停游戏中一样可以按下时,它将恢复你的精灵的旋转和下落。

于 2014-12-26T10:18:15.877 回答
0

停止动画?

[ [ CCDirector sharedDirector ] stopAnimation ];

[ [ CCDirector sharedDirector ] startAnimation ];

如果你想停止一切,像你在其他地方看到的那样暂停(在菜单移动到位之后),然后在用户触摸某个东西时取消暂停。

于 2013-03-26T21:41:18.777 回答