【问题标题】:cocos2d director flow control: replace scene after push scene. What happens to the pushed scene?cocos2d director 流控:推场景后替换场景。被推送的场景会发生什么?
【发布时间】:2011-09-29 09:59:09
【问题描述】:
// TRY TO AVOID A BIG STACK OF PUSHED SCENES
-(void) mainMenu()
{
    // etc
    [[CCDirector sharedDirector] pushScene: gameScene];
}
// stack:
//   . game  <-- running scene
//   . mainMenu

-(void) game
{
    [[CCDirector sharedDirector] pushScene: gameOverScene];
}
// stack:
//   . gameOver  <-- running scene
//   . game
//   . mainMenu

-(void) showGameOver
{
    [[CCDirector sharedDirector] pushScene: hiScoreScene];
}
// stack:
//   . scores  <-- running scene (4 pushed scenes... expensive)
//   . gameOver
//   . game
//   . mainMenu

-(void) toMainMenu
{
    [CCDirector sharedDirector] replaceScene: mainScene];
}
// stack:
//   I don't know...

我想在 replaceScene: 调用之后杀死堆栈中的所有场景。但我不知道它是否会发生。

【问题讨论】:

    标签: memory-management cocos2d-iphone


    【解决方案1】:

    我只是被这个咬了(cocos2d-x,但同样的概念)。我现在的经验法则是 - 如果退出该屏幕的唯一方式是弹出场景,则仅推送场景。如果你想从你推送的场景转到另一个场景,你应该使用 replaceScene 代替。

    【讨论】:

      【解决方案2】:

      只使用 replaceScene。

      推送和弹出场景仅适用于快速间歇,即显示设置屏幕。您将希望避免任何推送场景的情况,在这种情况下可能会调用 replaceScene。跟踪当前场景堆栈变得非常复杂和不方便(Director 没有提供方便的方法来让您管理场景堆栈)。很容易意外地不断增加推送场景的堆栈,直到内存不足。

      简短的回答是:尽可能避免弹出和推送场景。如果需要保持状态,创建一个 Singleton 类,用于存储替换场景时需要持久化的值。

      【讨论】:

      • 感谢您重播 Steffen。我实际上使用 pop 和 push 来获得游戏菜单。您可以选择继续游戏或退出。 if resume pop else replace.
      • @zeiteisen,如果不继续,你会replaceScene,对吧?但在那种情况下,它只会取代你的in game menu,对吗?那么推送in game menu的场景会留在记忆中……
      • 新的 cocos2d 版本因为这个原因有 popToRootScene
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多