我知道这个问题之前已经被问过并得到了回答,但似乎没有一个答案适合我想要做的事情。我需要能够暂停动画,但仍然能够让我的暂停菜单出现并要求用户输入。这可能吗?如果可以,我该怎么做。
9 回答
有两种方法pause
,resume
为此目的CCDirector
:
[[CCDirector sharedDirector] pause];
和
[[CCDirector sharedDirector] resume];
从文档中:
正在运行的场景将被绘制,但所有计划的计时器将被暂停暂停时,绘制速率将为 4 FPS,以减少 CPU 消耗
我建议你在 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"
我尝试了所有的建议,但没有一个对我有用,所以这就是我最终做的对我来说非常有效的方法。这是暂停。
[self pauseSchedulerAndActions];
for (CCNode *child in [self children]) {
[child pauseSchedulerAndActions];
}
这要恢复:
[selfReference resumeSchedulerAndActions];
for (CCNode *child in [selfReference children]) {
[child resumeSchedulerAndActions];
}
在 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];
}
}
希望这可以帮助。
试试这个 PauseButton 类https://github.com/iabtyagi/custom-pause-cocos2d。完全符合您的要求。
我用:
@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];
我是 cocos2D 的新手,并且使用了单独的游戏循环(而不是 scheduleupdate),并且正在取消调度它以及更多的调度程序。在我在游戏层上放置一个新层(即 Pauselayer)的同时,它会自动暂停游戏。看起来很复杂,但对我有用。
CCPhysicsNode *_physics;
_physics.paused = true;// 它会暂停你的游戏,但不会暂停动作。
_physics.paused = false;// 当按钮像在暂停游戏中一样可以按下时,它将恢复你的精灵的旋转和下落。
只停止动画?
[ [ CCDirector sharedDirector ] stopAnimation ];
[ [ CCDirector sharedDirector ] startAnimation ];
如果你想停止一切,像你在其他地方看到的那样暂停(在菜单移动到位之后),然后在用户触摸某个东西时取消暂停。