2011-01-27 5 views
2

Как перезапустить сцену cocos2d и очистить память после предыдущего?Правильный перезапуск сцены cocos2d?

[director replaceScene:s] отображает розовый экран. Не могу заставить его работать.

Обходной я сделал ниже, однако после закрытия сцены таким образом приложение работает очень медленно и медленно реагирует на касание. MainViewController.m:

- (IBAction)startScene { 

[CCTexture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA8888]; 

if ([director runningScene]) { 
    [director end]; 
    works = NO; 
} 
if (!works) { 
    EAGLView *glview = [EAGLView viewWithFrame:CGRectMake(0,0, 768, 1024)]; 
    [self.view addSubview:glview]; 
    [director setOpenGLView:glview]; 
    CCLayer *layer = [PlayLayer node]; 
    CCScene *s = [CCScene node]; 
    [s addChild: layer]; 
    [director runWithScene:s]; 
} 

}

Внутри PlayLayer.m Я возвращаюсь от сцены для просмотра с помощью:

CCDirector *d = [CCDirector sharedDirector]; 
EAGLView *v = [d openGLView]; 
[v removeFromSuperview]; 

приложение выводит изображения (1280x960x32, ImageView внутри Scrollview), и когда пользователь нажимает кнопку, он может запустить сцену cocos2d. Затем пользователь может выйти из сцены обратно в режим просмотра (.xib) и продолжить просмотр изображений, пока не найдет новый, чтобы начать сцену.

Я считаю, что это не лучший способ покинуть сцену, но все остальное, что я пробовал, вызывает приложение для краха, или я продолжаю получать этот розовый экран. В 2 раза я начинаю сцену. Как перезапустить его?

ответ

0

Хорошо, нашел решение, которое закрывает сцену изнутри и хорошо работает.

При запуске сцены добавить наблюдателя уведомления в моем ViewController:

(...) 
[director runWithScene:s]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(mySceneEnd:) name:@"scene_ended" object:nil]; 

Это связано с:

- (void) mySceneEnd:(NSNotification *)notif { 
    if ([director runningScene]) 
     [director end]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

Затем в методе сцены окончание я отправляющего уведомление на мой ViewController :

EAGLView *v = [[CCDirector sharedDirector] openGLView]; 
[v removeFromSuperview]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"scene_ended" 
    object:nil userInfo:nil]; 

Работает очень хорошо, приложение работает быстро после закрытия sce ne, но это старый вопрос/ответ, и теперь есть лучший способ сделать это.

2

Наконец-то я смог избавиться от розового экрана при замене сцены. Вот как я это делаю. Добавляя сцену, я проверяю, выполняется ли она в первый раз или в последующие моменты времени.

MyTestAppDelegate * appDelegate = (MyTestAppDelegate *)[[UIApplication sharedApplication] delegate]; 
EAGLView *glView; 
//check if scene is running first time then create OpenGLView, add to director and run the scene 
if ([[CCDirector sharedDirector] runningScene] == NULL) { 
    if(! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink]) 
     [CCDirector setDirectorType:kCCDirectorTypeDefault]; 

    CCDirector *director = [CCDirector sharedDirector]; 
    glView = [EAGLView viewWithFrame:[appDelegate.window bounds] 
            pixelFormat:kEAGLColorFormatRGB565 // kEAGLColorFormatRGBA8 
            depthFormat:0      // GL_DEPTH_COMPONENT16_OES 
         ]; 
    [director setOpenGLView:glView];   
    [director setDeviceOrientation:kCCDeviceOrientationPortrait]; 
    [director setAnimationInterval:1.0/60]; 
    [director setDisplayFPS:YES]; 
    [appDelegate.window addSubview:glView];  

    [[CCDirector sharedDirector] runWithScene: [MyScene node]]; 
} 
//if scene is to be reloaded, add back the openGLView which was removed when removing the scene 
else {  
    [appDelegate.window addSubview:[[CCDirector sharedDirector] openGLView]]; 
    [[CCDirector sharedDirector] replaceScene:[MyScene node]]; 
} 

Для удаления в настоящее время работает сцена:

[[CCDirector sharedDirector] replaceScene:[MySceneTwoLayer scene]]; 
[[CCDirector sharedDirector].openGLView removeFromSuperview]; 

Добавление MySceneTwoLayer является необязательным. Это пустая сцена. Я использую его, чтобы убедиться, что предыдущая сцена была правильно удалена. И я проверил, что dealloc предыдущей сцены правильно вызван.

Надеюсь, это поможет.

+0

Я буду проверять его как можно скорее, спасибо за память! Мое текущее решение немного хаотично ... – yosh

1

Я столкнулся с проблемой simliar при использовании раскадровки и возвратом к оригинальному представлению пользовательского интерфейса, в котором содержался мой CCGLView с другого вида.

//when leaving the scene containing the CCGLView. 
[CCDirector director] popScene]; 

тогда я заметил в viewDIdLoad для этого ViewController, было бы пройти через это, когда пересоздан Б.Т. в Segue, где вы можете повторно добавить сцену снова.

// in viewDidLoad 
[CCDirector director] pushScene: theSceneIRemovedEtc]; 

Admititedly это mightnot работа для всех случаев, но, конечно же, для меня ..

+0

Работал как шарм! – Myxtic

Смежные вопросы