Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Cocos2d和并发:如何正确停止场景之间的动画_Objective C_Multithreading_Concurrency_Cocos2d Iphone_Thread Safety - Fatal编程技术网

Objective c Cocos2d和并发:如何正确停止场景之间的动画

Objective c Cocos2d和并发:如何正确停止场景之间的动画,objective-c,multithreading,concurrency,cocos2d-iphone,thread-safety,Objective C,Multithreading,Concurrency,Cocos2d Iphone,Thread Safety,我有一个游戏场景(这里称为Shootersene),我确实退出到主菜单。我确实使用在纹理缓存中加载的精灵表。有各种各样的动画(背景元素、敌人、玩家等等)。几个月来,我遇到了一个问题,即针对敌人的“setTexture”方法的断言失败。我通过在替换场景之前暂停共享CCDirector解决了这个问题。这具有停止动画的效果。然而,我只是部分解决了这个问题。游戏不再在敌人的setTexture上崩溃,但现在在AnimatedBackgroundElement setTexture方法上崩溃 背景元素被添

我有一个游戏场景(这里称为Shootersene),我确实退出到主菜单。我确实使用在纹理缓存中加载的精灵表。有各种各样的动画(背景元素、敌人、玩家等等)。几个月来,我遇到了一个问题,即针对敌人的“setTexture”方法的断言失败。我通过在替换场景之前暂停共享CCDirector解决了这个问题。这具有停止动画的效果。然而,我只是部分解决了这个问题。游戏不再在敌人的setTexture上崩溃,但现在在AnimatedBackgroundElement setTexture方法上崩溃

背景元素被添加到精灵批处理节点,该节点是作为子级添加到游戏场景的背景类的子级。我确实想知道,出于某些层次结构的原因,暂停调用的传播是否有延迟,或者在“暂停”线程和后台元素的CCAnimate->setTexture线程之间是否存在一些并发问题

有什么建议/想法吗

PS:我检查了“[[CCDirector sharedDirector]stopAnimation]”,上面写着:

CCLOG(@"cocos2d: Director#stopAnimation. Override me");
我是否打算“覆盖”此方法以解决上述问题?我想这将是一个很好的地方,可以通过递归调用真正停止所有子对象的所有动画,但同样,由于可能与后续的“replaceSecene”方法并发,我不确定延迟。我可以通过使用一系列回调来解决这个问题(CCSequence with action1=调用停止动画,action2=替换场景),但我同样不能100%确定,调用action2只会在调用停止动画(action1)结束后发生。我可以为(所有的孩子)写一个递归,并把它放在替换场景之前。。或者延迟回调replaceSecene(这不是一个优雅的解决方案,因为它是半任意的)

PPS:我看到有很多关于尝试一个场景的相关信息。我想其他人可能也有类似的问题,所以可能有最先进的解决方案/设计模式

编辑:我已尝试实现此功能,但仍然失败

-(void) restartLevel
{
    [self resetSharedData];
    [[CCDirector sharedDirector] pause];
    LevelName currentLevel = [GameController sharedGameController].currentlyPlayedLevelName;

    [self stopAllActions];   //Does this actually stopAllActions and Animations for ALL child nodes?
    [self unscheduleAllSelectors];
    //Do I need something else here?
     [[CCDirector sharedDirector] replaceScene:[ShooterScene sceneWithLevelName:currentLevel]];
}

愚蠢的问题,为什么是[自我停止运动];不工作?我称之为[自我计划外选择器];在场景更改之前,它会重击整个层中的每个动画对象和计时器,这样可以安全地切换场景而不会出现断言失败

关于暂停的事情,我知道!!说真的,整个暂停的过程真的很烦躁,它似乎暂停了一些东西,但并不总是暂停一些东西。据我所知,当您暂停时:计时器停止(dt不增加),加速计和触摸仍然工作,动画对象和移动对象停止移动,菜单按钮仍然工作,菜单按钮调用的函数中的所有代码仍然运行。此外,它还完成了调用暂停的函数中的所有代码,因此,如果在一个函数中执行暂停,然后取消计时器和更改场景,那么仍然会出现分配错误

更具体地说,我是这样做的: -停止所有动画 -停止计时 -将变量“gameRunning”设置为false,如果(!gameRunning)返回,则在gameLogic的第一行; -将计时器设置为0.1秒,使其仅触发一次,以调用makeTransition函数
-在计时器内更改实际场景。

[self-stopAllActions];并非真正停止添加到层的子节点的所有操作。您需要在特定节点上手动调用stopAllActions

-(void)onExit
{
   [self.gameHeroSprite  stopAllActions]; //call this for all animated sprite
   [self stopAllActions];
   [super onExit];
}

非常感谢您的回答,我将尝试现在就实施,然后接受,如果它有效。。但是,读你所说的,似乎会奏效。我没有发现停止行动,只有[自我停止行动]。你能帮我写一些停止动画的代码吗?我已经接受了,虽然还没试过。悬赏金快到期了,我想这会管用的。如果对其他人不公平并让你了解情况,我们将不予接受。同时谢谢你:)
-(void)onExit
{
   [self.gameHeroSprite  stopAllActions]; //call this for all animated sprite
   [self stopAllActions];
   [super onExit];
}