我知道这个问题之前已经被问过和回答,但没有一个答案似乎符合我的要求。我需要能够暂停动画,但仍然可以让我的暂停菜单出现并询问用户输入。这是可能的,如果可以的话,我该怎么做呢。
答案 0 :(得分:7)
pause
为此目的有resume
和CCDirector
两种方法:
[[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; //在暂停游戏期间按钮可按下时,它将恢复精灵的旋转和下降。