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的代码相同。我发现这是一种享受,让我能够同时进行场景转换。