如何在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 克隆的子组件不会随着道具的变化而重新渲染