앱을 실행해서 작동하다가, 홈 버튼을 누르거나 전화가 오는 등의 이유로 백그라운드로 전환 되었을 때 다시 앱으로 돌아오고 나서 스프라이트가 검정색으로 나오는 현상이 일어났다.
이 문제는 cocos2d-x 의 예전 버전을 사용할 때는 없었던 현상인데, 2.1.3 으로 업그레이드 한 후에 발생하기 시작했다. 하지만 예전 버전에서도 같은 현상이 일어난다는 얘기도 있다.
void AppDelegate::applicationWillEnterForeground()
{
//CCDirector::sharedDirector()->stopAnimation();
//CCDirector::sharedDirector()->resume();
CCDirector::sharedDirector()->startAnimation();
CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}
Foreground 로 복귀했을 때 AppDelegate 의 applicationWillEnterForeground 메서드는 정상 호출되고, 음악도 플레이가 다시 시작되는 것으로 보아 이쪽의 문제는 아니었다.
위의 주석 부분에 해당 되는 내용을 추가하면 된다는 조언도 있었으나 아무 소용 없었다.
이 현상이 발생한 후로는 LogCat 에 아래와 같은 로그가 남기 시작하는데,
D/cocos2d-x debug info(13584): OpenGL error 0x0502 in /SomeFolder/cocos/x2.1.3/cocos2d-2.1rc0-x-2.1.3/SomeAppName/proj.android/../../cocos2dx/sprite_nodes/CCSprite.cpp draw 589
D/cocos2d-x debug info(13584): OpenGL error 0x0501 in /SomeFolder/cocos/x2.1.3/cocos2d-2.1rc0-x-2.1.3/SomeAppName/proj.android/../../cocos2dx/sprite_nodes/CCSprite.cpp draw 589
D/cocos2d-x debug info(13584): OpenGL error 0x0502 in /SomeFolder/cocos/x2.1.3/cocos2d-2.1rc0-x-2.1.3/SomeAppName/proj.android/../../cocos2dx/sprite_nodes/CCSprite.cpp draw 589
딱 봐도 OpenGL 관련해서 Sprite 처리에 문제가 생겼음을 알 수 있다.
알수는 있다... 해결을 못해서 그렇지...
당연히 cocos2d 엔진 만든 놈들이 해결해야지...?
다행이도, 해결 방법은 있었다.
우선, cocos2dx 의 header 파일 하나를 수정한다.
cocos2dx/platform/CCPlatformMacros.h
[84] #define CC_ENABLE_CACHE_TEXTURE_DATA 1
그리고, 아래 파일의 주석을 제거한다.
/proj.android/jni/hellocpp/main.cpp
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
{
if (!CCDirector::sharedDirector()->getOpenGLView())
{
CCEGLView *view = CCEGLView::sharedOpenGLView();
view->setFrameSize(w, h);
AppDelegate *pAppDelegate = new AppDelegate();
CCApplication::sharedApplication()->run();
}
else
{
ccDrawInit();
ccGLInvalidateStateCache();
CCShaderCache::sharedShaderCache()->reloadDefaultShaders();
CCTextureCache::reloadAllTextures();
CCNotificationCenter::sharedNotificationCenter()->postNotification(EVNET_COME_TO_FOREGROUND, NULL);
CCDirector::sharedDirector()->setGLDefaultValues();
}
}
코드만 봐도 reloadAllTextures() ... 뭔가 될 것 같은 느낌이 팍 온다 (...)
이걸 해주고 리빌드를 해주면, 정상적으로 작동!
그 동안 홈 버튼 누르고 나갔다가 들어왔을 때 앱이 안되서 정말 짜증났었는데, 이렇게 해결하면 됨.
'개발 > cocos2d' 카테고리의 다른 글
cocos2d-x 3.4 우분투(리눅스) 환경 설정 (0) | 2015.02.08 |
---|---|
build_native.sh 실행시 개행문자 오류 (0) | 2014.02.12 |
이클립스 Unable to execute dex: java.nio.BufferOverflowException (6) | 2013.11.20 |
cocos2dx 에서 build_native.sh clean 실패 (0) | 2013.08.14 |
cocos2d-x 스크립트로 프로젝트 생성 후 빌드 오류 (2) | 2013.01.16 |