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

时间:2014-09-10 03:47:07

标签: cocos2d-iphone

我将预加载的场景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];

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

2 个答案:

答案 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));
}