Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cocos2d iphone popScene:未完成的事件_Iphone_Ios_Cocos2d Iphone - Fatal编程技术网

cocos2d iphone popScene:未完成的事件

cocos2d iphone popScene:未完成的事件,iphone,ios,cocos2d-iphone,Iphone,Ios,Cocos2d Iphone,所以我正在用cocos2d开发一款iPhone游戏 我使用pushScene从我的游戏场景过渡到主菜单场景,因为我希望玩家能够在他们选择的情况下从主菜单恢复游戏。如果他们选择继续,我使用popScene 问题似乎在于,如果在推送游戏场景时事件“不完整”,则在弹出场景时,这些事件不会完成。更糟糕的是,它们在场景中留下了自己无法清除的瑕疵 示例:粒子爆炸效果(粒子被“冻结”且不会按设计消散)、精灵淡出效果(精灵在一定透明度水平下保持可见) 我想我本以为popScene会像推送场景时一样恢复场景,但它

所以我正在用cocos2d开发一款iPhone游戏

我使用pushScene从我的游戏场景过渡到主菜单场景,因为我希望玩家能够在他们选择的情况下从主菜单恢复游戏。如果他们选择继续,我使用popScene

问题似乎在于,如果在推送游戏场景时事件“不完整”,则在弹出场景时,这些事件不会完成。更糟糕的是,它们在场景中留下了自己无法清除的瑕疵

示例:粒子爆炸效果(粒子被“冻结”且不会按设计消散)、精灵淡出效果(精灵在一定透明度水平下保持可见)

我想我本以为popScene会像推送场景时一样恢复场景,但它似乎“放弃”了当前正在运行的操作


如何实现我的目标?

我建议您将游戏层和主菜单层添加到与孩子相同的
CCScene
,而不是使用
pushScene
popsene
。当需要显示菜单时,请更改层的可见性并暂停游戏层中的所有内容。您可以尝试以下方法以递归方式暂停/恢复游戏层的活动:

- (void)pauseSchedulerAndActionsRecursive:(CCNode *)node {
    [node pauseSchedulerAndActions];
    for (CCNode *child in [node children]) {
        [self pauseSchedulerAndActionsRecursive:child];
    }
}

- (void)resumeSchedulerAndActionsRecursive:(CCNode *)node {
    [node resumeSchedulerAndActions];
    for (CCNode *child in [node children]) {
        [self resumeSchedulerAndActionsRecursive:child];
    }
}
称之为:

[self pauseSchedulerAndActionsRecursive:gamePlayLayer];

我使用了Hailei的代码,但创建了一个适合我的类别

CCNode+additions.h

#import "CCNode.h"

@interface CCNode (additions)
-(void)pauseSchedulerAndActionsRecursive;
-(void)resumeSchedulerAndActionsRecursive;
@end
CCNode+additions.m

#import "CCNode+additions.h"

@implementation CCNode (additions)
-(void)pauseSchedulerAndActionsRecursive {
    [self pauseSchedulerAndActions];
    for (CCNode *child in [self children]) {
        [child pauseSchedulerAndActionsRecursive];
    }
}
-(void)resumeSchedulerAndActionsRecursive {
    [self resumeSchedulerAndActions];
    for (CCNode *child in [self children]) {
        [child resumeSchedulerAndActionsRecursive];
    }
}
@end

因此,暂停时,在游戏节点中添加“暂停菜单节点”之前,请在游戏节点上调用PauseScheduler和DactionsRecursive(否则暂停节点也将暂停,因此无法使用)。

这是一个非常好的主意。我试试看。我可能需要一周左右的时间才能回来汇报。Halley最初还建议:“你可以尝试以下方法来递归暂停/恢复游戏层的活动:
code
-(void)pauseSchedulerAndActions递归:(CCNode*)节点{[node pauseSchedulerAndActions];for(CCNode*child in[node children]){[self-PauseScheduleAndActionsRecursive:child];}-(void)resumeSchedulerAndActionsRecursive:(CCNode*)节点{[node resumeSchedulerAndActions];for(CCNode*child in[node children]){[self-resumeSchedulerAndActionsRecursive:child];}
code
***结论***我将我的菜单场景转换为一个层,我正在按照建议进行操作,根据需要调整层的可见性。这是一个非常好的解决方案。不需要更复杂的方案,只需要使用CCDirector在切换到菜单层时暂停游戏。这对防止ani有不利影响菜单层上的动画在显示菜单时不会播放,但该方法的简单性以及它的一致性和可靠性很容易证明从我的菜单中删除一些动画是合理的。