Cocos2d:在第二次调用replacescene后,调度方法无响应

时间:2012-02-09 17:27:20

标签: animation cocos2d-iphone

在Menu.h中首次启动方法"StartGame:",游戏无可挑剔。

然而,在游戏时间,如果用户返回菜单 - 我使用

[[CCDirector sharedDirector]replaceScene:[Menu scene]];

所有类型的动画冻结和计划功能都没有响应。

到底发生了什么事?

3 个答案:

答案 0 :(得分:2)

您是否覆盖了这些方法中的任何一种?

 -(void) onEnter;
 -(void) onEnterTransitionDidFinish;
 -(void) onExit;
 -(void) cleanup;

如果是这样,请确保在每个方法中调用超级实现(即[super onEnter];),否则会发生各种奇怪的事情。

答案 1 :(得分:2)

我不确定这是否是同一个问题,但我最近发现的是,如果我想使用replaceScene在两个场景之间进行交换,我希望将“旧”场景保持为单个可以换回到以后,对replaceScene的调用最终在那个场景上调用“清理”,这使得场景完好无损,除了任何具有块或选择器形式的处理程序的按钮(内部被块包裹)丢失了它们的处理程序当您换回“旧”场景时,它会变得没有反应。

我已经这样做了,每当用户从主菜单进入应用程序的另一部分时,应用程序并不总是创建全新的场景对象(以及他们所有的孩子)。

为了解决这个问题,我不得不重新设计,以便每次转换时都会重新创建场景,或者向CCDirector添加调整:

-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup

到目前为止,我所做的是向CCDirector.replaceScene添加一个覆盖,它接受一个清理参数(类似于其他removeAndCleanup消息)。这允许有问题的应用程序在应用程序不希望清除时,在没有清除的情况下保留场景。

这方面的实施是:

-(void) replaceScene: (CCScene*) scene
{
    [self replaceScene:scene andCleanup:YES];
}

-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup
{
    NSAssert( scene != nil, @"Argument must be non-nil");

    NSUInteger index = [scenesStack_ count];

    sendCleanupToScene_ = andCleanup;
    [scenesStack_ replaceObjectAtIndex:index-1 withObject:scene];
    nextScene_ = scene; // nextScene_ is a weak ref
}

如果有人认为这是一种愚蠢的方式,请告诉我。

答案 2 :(得分:0)

我也遇到了问题(在v3.1.1中)并且没有覆盖任何onEvent处理程序,因此调用super(如@ LearnCocos2D所示)在这里不适用。

我找不到修复。在调用replaceScene之前或之后调用导演的恢复功能,为我解决了这个问题。

[[CCDirector sharedDirector] replaceScene:scene];
[[CCDirector sharedDirector] resume];