Animation Cocos2d:在第二次调用ReplaceSecene后调度方法无响应

Animation Cocos2d:在第二次调用ReplaceSecene后调度方法无响应,animation,cocos2d-iphone,Animation,Cocos2d Iphone,第一次方法“startName:”在Menu.h中启动,游戏运行完美 然而,在游戏期间,如果用户返回菜单-我使用 [[CCDirector sharedDirector]替换场景:[菜单场景]] 所有类型的动画冻结和调度功能都没有响应 到底发生了什么事 您是否覆盖了这些方法中的任何一种 -(void) onEnter; -(void) onEnterTransitionDidFinish; -(void) onExit; -(void) cleanup; 如果是这样,请确保在每个方法中

第一次方法
“startName:”
在Menu.h中启动,游戏运行完美

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

[[CCDirector sharedDirector]替换场景:[菜单场景]]

所有类型的动画冻结和调度功能都没有响应


到底发生了什么事

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

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

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

是否覆盖了这些方法中的任何一个

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

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

我不确定这是否是同一个问题,但我最近发现,如果我想使用replaceSecene在两个场景之间交换,我想保留“旧的”场景作为一个可以稍后交换回的单例,对replaceSecene的调用最终会在该场景上调用“cleanup”,这会使场景保持完整,除非任何具有块或选择器形式的处理程序(在内部由块包装)的按钮在交换回“old”时丢失其处理程序并变得无响应场景

我这样做是为了在用户每次从主菜单转到应用程序的另一部分时,应用程序不会总是创建全新的场景对象(以及它们的所有子对象)

为了解决这个问题,我要么重新设计,以便每次有过渡时都能重新创建场景,要么对CCDirector进行调整:

-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup
到目前为止,我所做的是向CCDirector.replaceSecene添加一个接受清理参数的覆盖(类似于其他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
}

如果有人认为这是一种愚蠢的方式,请让我知道。

我不确定这是否是同一个问题,但我最近发现,如果我想使用ReplaceSecene在两个场景之间交换,其中我想将“旧”场景保留为一个单独的场景,可以稍后再交换,那么对ReplaceSecene的调用最终会调用“清理”在该场景中,除了具有块或选择器形式的处理程序(在内部由块包装)的任何按钮在您切换回“旧”场景时丢失其处理程序并变得无响应之外,该场景将保持场景的完整性

我这样做是为了在用户每次从主菜单转到应用程序的另一部分时,应用程序不会总是创建全新的场景对象(以及它们的所有子对象)

为了解决这个问题,我要么重新设计,以便每次有过渡时都能重新创建场景,要么对CCDirector进行调整:

-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup
到目前为止,我所做的是向CCDirector.replaceSecene添加一个接受清理参数的覆盖(类似于其他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
}

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

我也有这个问题(在v3.1.1中),并且我没有覆盖任何OneEvent处理程序,因此调用super(如@learncos2D所建议的)在这里不适用

不过,我确实找到了解决办法。在调用replaceSecene之前或之后调用director的resume函数可以解决我的问题

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

一、 也有问题(在v3.1.1中),并且我没有覆盖任何OneEvent处理程序,因此调用super(如@learncos2D所建议的)在这里不适用

不过,我确实找到了解决办法。在调用replaceSecene之前或之后调用director的resume函数可以解决我的问题

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

所以我在iPhone的Cocos2d上遇到了同样的问题,v。2.0.
CCMenuItem
对象的回调块丢失,因为它们的清理方法实现会释放块。(这在1.0版中没有发生)。由于它们将在
dealloc
中发布,我觉得从它们的
清理中删除这些代码行是非常安全的method@AndreyLushnikov实际上,我将上面的解决方案转化为一个类别,这样我的Cocos2D代码与git repo的代码相同。我发现这是一种享受,让我能够双向进行场景转换。2.0. 
CCMenuItem
对象的回调块丢失,因为它们的清理方法实现会释放块。(这在1.0版中没有发生)。由于它们将在
dealloc
中发布,我觉得从它们的
清理中删除这些代码行是非常安全的method@AndreyLushnikov实际上,我将上面的解决方案转化为一个类别,这样我的Cocos2D代码与git repo的代码相同。我发现这是一种享受,让我能够同时进行场景转换。