Управление потоком управления cocos2d: заменить сцену после push-сцены. Что происходит с выдвинутой сценой? - PullRequest
1 голос
/ 29 сентября 2011
// 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 :. Но я не знаю, случится ли это.

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Я был просто укушен этим (cocos2d-x, но та же концепция).Мое эмпирическое правило теперь таково - толкать сцену только в том случае, если only способ выйти из этого экрана - это открыть сцену.Если вы хотите перейти в другую сцену из той, которую вы нажали, вместо нее следует использовать replaceScene.

1 голос
/ 30 сентября 2011

Просто используйте replaceScene повсюду.

Нажатие и выталкивание сцен имеет смысл только для быстрых перерывов, то есть для отображения экрана настроек.Вы захотите избежать любого сценария, в котором вы перемещаете сцену, где потенциально может последовать вызов replaceScene.Отслеживать текущий стек сцены становится очень сложно и неудобно (Director не предоставляет удобных методов, позволяющих вам управлять стеком сцены).Очень легко случайно продолжать наращивать стек запрошенных сцен до тех пор, пока не закончится память.

Краткий ответ: избегайте появления и выталкивания сцен, когда это возможно.Если вам нужно сохранить состояние, создайте класс Singleton, в котором хранятся значения, которые необходимо сохранить при замене сцен.

...