2012-04-21 71 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你的遊戲節點上添加一個「暫停菜單節點「添加到遊戲節點(否則暫停節點也會暫停並因此不可用)。