2012-04-21 72 views
0

所以我正在开发一个使用cocos2d的iPhone游戏。cocos2d-iphone popScene:不完整的事件

我使用pushScene从我的游戏场景转换到主菜单场景,因为我希望玩家能够从主菜单恢复游戏玩法,如果他们选择。如果他们选择恢复,我使用popScene。

问题似乎是,如果事件在推送游戏场景时“不完整”,当场景弹出时,这些事件不会完成。更糟糕的是,他们在场景中留下了自己不清楚的文物。示例:粒子爆炸效果(粒子被“冻结”并且不按设计消散),精灵淡出效果(精灵在特定透明度水平下仍然可见)。

我想我会期望popScene恢复场景,就像场景被推入时一样,但它似乎是“放弃”当前正在运行的动作。

我该如何实现目标?

回答

0

我建议您将游戏播放图层和主菜单图层添加到与儿童相同的CCScene,而不是使用pushScenepopScene。当您需要显示菜单时,更改图层的可见性并暂停游戏图层中的所有内容。

[self pauseSchedulerAndActionsRecursive:gamePlayLayer]; 
+0

这是一个非常好的主意。我会试一试。我可能需要一个星期左右才能报告。 – robbpriestley 2012-04-25 15:57:14

+0

哈雷还原本建议如下: – robbpriestley 2012-05-01 18:37:24

+0

“你可以试试这些方法递归暂停/游戏层的恢复活动: 'code' - (空)pauseSchedulerAndActionsRecursive:(CCNode *)节点{ [节点pauseSchedulerAndActions] 为(CCNode *子在[节点儿童]){ [自pauseSchedulerAndActionsRecursive:子]; } } - (无效)resumeSchedulerAndActionsRecursive:(CCNode *)节点{ [节点resumeSchedulerAndActions]; 为(CCNode *子节点] { [self resumeSchedulerAndActionsRecursive:child]; } }'code' – robbpriestley 2012-05-01 18:45:30

0

我用海雷的代码,但创建为我的作品OK类别:您可以尝试这些方法递归暂停游戏层/恢复活动:像

- (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]; 
    } 
} 

呼叫东西​​。

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 

所以暂停时,之前调用pauseSchedulerAndActionsRecursive你的游戏节点上添加一个“暂停菜单节点“添加到游戏节点(否则暂停节点也会暂停并因此不可用)。