2011-01-27 4 views
2

어떻게 이전의 코코스 2D 장면을 다시 시작하고 메모리를 정리합니까?올바른 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]; 

응용 프로그램이있는 ScrollView 내부 디스플레이 이미지 (1280x960x32, 이미지 뷰입니다) 사용자가 버튼을 누르면 cocos2d 장면을 시작할 수 있습니다. 그런 다음 사용자는 장면을 떠나 장면 (.xib)을보고 새 장면을 찾을 때까지 이미지를 계속 탐색하여 장면을 시작할 수 있습니다.

나는 이것이 장면을 떠나는 좋은 방법이 아니라고 생각하지만, 내가 시도한 다른 모든 것은 응용 프로그램을 중단 시키거나이 분홍색 화면을 계속 두 번째로 시작하여 장면을 시작합니다. 어떻게 다시 시작합니까?

답변

0

좋아요, 내부에서 장면을 닫고 잘 작동하는 해결책을 찾았습니다. 장면을 시작하는 동안

나는 나의의 ViewController에 알림 관찰자를 추가 : 내의 ViewController에 통지를 보내고있다 장면 종료 방법 그리고

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

:에 연결되어

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

:

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

정말 멋지다. 응용 프로그램이 닫힌 후 빠르게 실행됩니다. 네,하지만 그것은 오래된 질문/대답이고 확실하게 지금 그것을하는 더 좋은 방법이 있습니다.

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

Storyboards를 사용할 때 및 다른 뷰에서 내 CCGLView가 포함 된 원래 UI보기로 돌아갈 때 simliar 문제가 발생했습니다.

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

는 당신이 다시 장면을 다시 추가 할 수 있습니다 SEGUE, BT는 다시 인스턴스화 할 때이 통과 것, 그의 ViewController 위해있는 viewDidLoad에 나타났습니다.

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

Admititedly이 mightnot의 모든 경우에 대한 작업을하지만 확실히 나를 위해 한 ..

+0

매력처럼 작동했습니다! – Myxtic

관련 문제