如何在Cocos2D v3.x中正确推送和弹出场景

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Cocos2D v3.x中正确推送和弹出场景相关的知识,希望对你有一定的参考价值。

我将预加载的场景B推到这样的场景A.场景B中的根节点有一个运行约2秒的动画,我希望在动画完成时弹出场景B.我认为它应该像下面这样工作。然而它在popScene上崩溃了。 push / pop是否真的适用于Cocos2D v3?

SceneRedroom* sceneredroom = (SceneRedroom*)[self.ccscenewithSceneredroom getChildByName:@"SceneRedroom" recursively:NO];
[sceneredroom.animationManager setCompletedAnimationCallbackBlock:^(id sender) {
        [[CCDirector sharedDirector] popScene];
}];

[[CCDirector sharedDirector] pushScene:self.ccscenewithSceneredroom];

我得到的崩溃是相当随机的。在推送和/或弹出场景时,似乎有些东西被错误地解除分配或类似。

答案

经过进一步的研究,我设法通过这篇文章找到了我遇到的问题的解决方案。我删除了CCDirector暂停并在我的pauseGame和resumeGame方法中恢复,然后添加了:

//pause
[sprite.actionManager pauseTarget:sprite];

//resume
[sprite.actionManager resumeTarget:sprite];

这停止了​​动画并保持“暂停”状态,即使游戏关闭然后重新打开,我甚至不需要玩AppDelegate类:)。我希望这对其他人也有帮助。

更新:以防万一其他人使用循环创建精灵,这是我如何设法为它创建暂停和恢复功能:

[sprite.actionManager pauseAllRunningActions];
[sprite.actionManager resumeTargets:[NSSet setWithArray:spriteArray]];

注意两者之间的区别(resumeTarget和resumeTargets),然后由于resumeTargets会要求NSSet,我只需将数组对象传递给带有上述代码的NSSet。

另一答案
void PauseScene::goToMainMenuScene(cocos2d::Ref *sender)
{
    Director::getInstance()->resume();
    auto scene = MainMenuScene::createScene();
    Director::getInstance()->replaceScene(TransitionFade::create(TRANSITION_TIME, scene));
}

void PauseScene::resumeScene(cocos2d::Ref *sender)
{
    Director::getInstance()->popScene();
}

void PauseScene::restartScene(cocos2d::Ref *sender)
{
    Director::getInstance()->resume();
    auto scene = GameScene::createScene();
    Director::getInstance()->replaceScene(TransitionFade::create(TRANSITION_TIME, scene));
}

以上是关于如何在Cocos2D v3.x中正确推送和弹出场景的主要内容,如果未能解决你的问题,请参考以下文章

如何在基于导航的应用程序中更改推送和弹出动画

React Native 克隆的子组件不会随着道具的变化而重新渲染

如何设置推送和弹出视图控制器流程

如何将 UINavigationControllerDelegate 中的自定义过渡动画应用于特定的推送和弹出事件?

如何禁用 NavigationView 推送和弹出动画

如何在ios中自定义推送和弹出动画时将视图传递给另一个控制器? [关闭]