我将预加载的场景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];
我得到的崩溃是相当随机的。在推送和/或弹出场景时,似乎有些东西被错误地解除分配或类似。
答案 0 :(得分:0)
经过进一步研究,我设法通过这篇文章找到了我遇到的问题的解决方案。我删除了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。
答案 1 :(得分:0)
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));
}