2012-06-13 18 views
6

mi juego cocos2d-x se bloquea al ingresar el fondo. Aquí hay un código de AppDelegate:cocos2d-x juego se bloquea al ingresar al fondo

// This function will be called when the app is inactive. When comes a phone call,it's be invoked too 
void AppDelegate::applicationDidEnterBackground() 
{ 

    CCDirector::sharedDirector()->pause(); 

    CCUserDefault::sharedUserDefault()->flush(); 

    CocosDenshion::SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); 

} 

// this function will be called when the app is active again 
void AppDelegate::applicationWillEnterForeground() 
{ 


    CCDirector::sharedDirector()->resume(); 

    CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); 
} 

y el mensaje de error:

libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient: 
0x3797e094: trap 
0x3797e096: nop  

nota que siempre se bloquea para el iPhone, pero el 99% de los accidentes en Android (bueno cuando el juego no se carga grande imágenes, etc.)

EDIT: He intentado CCDirector :: sharedDirector() -> stopAnimation() y funciona muy bien para iOS. Pero todavía se cuelga para Android (no inmediatamente cuando vuelvo a la aplicación, la pantalla se vuelve negra (pero creo que todavía está ejecutándose porque la música de fondo aún se está reproduciendo) y luego 5 segundos después se bloquea)

EDIT 2: el mensaje de error en Eclipse:.

libEGL call to OpenGL ES API with no current context (logged once per thread)  (red warning text) 

libc  Fatal signal 11 (SIGSEGV) at 0x5f012000 (code=2)     (black text) 

Respuesta

5

el delegado de la aplicación applicationDidEnterBackground: método se llama después sus transiciones de aplicación a los antecedentes, pero antes de se suspende su aplicación Desafortunadamente, es posible que no realice ninguna instrucciones de GPU mientras está en segundo plano, o el perro guardián lo terminará (como puede ver aquí).

Suponiendo que su llamada CCDirector::sharedDirector()->pause() es responsable de detener su ciclo de gráficos/animación, debe moverlo al método delegado applicationWillResignActive:. Ese método se llama antes de su aplicación pasa al segundo plano.

Sin embargo, tiene su código estructurado, asegúrese de que su ciclo de animación esté completamente enrojecido y detenido antes de regresar de la llamada de delegado applicationWillResignActive:.

Nota: Esta respuesta es en referencia a eso que siempre se estrella en IOS

+0

llamé a la ccdirector :: sharedDirector() -> stopAnimation() y funciona ahora – OMGPOP

+0

lo siento, se bloquea ahora para android. ios está bien – OMGPOP

+0

@OMGPOP Le sugiero que haga dos preguntas por separado porque las razones del bloqueo van a ser diferentes. Creo que habrá otra devolución de llamada en Android en la que tengas que dejar de actualizar la GPU pero no recibirás la devolución de llamada. –

Cuestiones relacionadas