initialize cocos with asset manager interface. separate out cocos init from android view init.

This commit is contained in:
folecr 2013-07-03 11:03:56 -07:00
parent 1fb4387d0a
commit 4539600ac2
1 changed files with 36 additions and 8 deletions

View File

@ -8,10 +8,13 @@
#include <android/log.h> #include <android/log.h>
#include <android_native_app_glue.h> #include <android_native_app_glue.h>
#include <pthread.h>
#include "CCDirector.h" #include "CCDirector.h"
#include "../CCApplication.h" #include "CCApplication.h"
#include "CCEventType.h" #include "CCEventType.h"
#include "support/CCNotificationCenter.h" #include "support/CCNotificationCenter.h"
#include "CCFileUtilsAndroid.h"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "cocos2dx/nativeactivity.cpp", __VA_ARGS__)) #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "cocos2dx/nativeactivity.cpp", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "cocos2dx/nativeactivity.cpp", __VA_ARGS__)) #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "cocos2dx/nativeactivity.cpp", __VA_ARGS__))
@ -54,11 +57,22 @@ struct engine {
extern "C" void cocos_android_app_init(void); extern "C" void cocos_android_app_init(void);
static void cocos_init(int w, int h) { typedef struct cocos_dimensions {
int w;
int h;
} cocos_dimensions;
static void cocos_init(cocos_dimensions d, AAssetManager* assetmanager) {
LOGI("cocos_init(...)");
pthread_t thisthread = pthread_self();
LOGI("pthread_self() = %X", thisthread);
cocos2d::FileUtilsAndroid::setassetmanager(assetmanager);
if (!cocos2d::Director::sharedDirector()->getOpenGLView()) if (!cocos2d::Director::sharedDirector()->getOpenGLView())
{ {
cocos2d::EGLView *view = cocos2d::EGLView::sharedOpenGLView(); cocos2d::EGLView *view = cocos2d::EGLView::sharedOpenGLView();
view->setFrameSize(w, h); view->setFrameSize(d.w, d.h);
cocos_android_app_init(); cocos_android_app_init();
@ -78,7 +92,11 @@ static void cocos_init(int w, int h) {
/** /**
* Initialize an EGL context for the current display. * Initialize an EGL context for the current display.
*/ */
static int engine_init_display(struct engine* engine) { static cocos_dimensions engine_init_display(struct engine* engine) {
cocos_dimensions r;
r.w = -1;
r.h = -1;
// initialize OpenGL ES and EGL // initialize OpenGL ES and EGL
/* /*
@ -123,7 +141,7 @@ static int engine_init_display(struct engine* engine) {
if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) { if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
LOGW("Unable to eglMakeCurrent"); LOGW("Unable to eglMakeCurrent");
return -1; return r;
} }
eglQuerySurface(display, surface, EGL_WIDTH, &w); eglQuerySurface(display, surface, EGL_WIDTH, &w);
@ -142,15 +160,20 @@ static int engine_init_display(struct engine* engine) {
glShadeModel(GL_SMOOTH); glShadeModel(GL_SMOOTH);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
cocos_init(w, h); r.w = w;
r.h = h;
return 0; return r;
} }
/** /**
* Just the current frame in the display. * Just the current frame in the display.
*/ */
static void engine_draw_frame(struct engine* engine) { static void engine_draw_frame(struct engine* engine) {
LOGI("engine_draw_frame(...)");
pthread_t thisthread = pthread_self();
LOGI("pthread_self() = %X", thisthread);
if (engine->display == NULL) { if (engine->display == NULL) {
// No display. // No display.
LOGW("engine_draw_frame : No display."); LOGW("engine_draw_frame : No display.");
@ -217,7 +240,12 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
case APP_CMD_INIT_WINDOW: case APP_CMD_INIT_WINDOW:
// The window is being shown, get it ready. // The window is being shown, get it ready.
if (engine->app->window != NULL) { if (engine->app->window != NULL) {
engine_init_display(engine); cocos_dimensions d = engine_init_display(engine);
if ((d.w > 0) &&
(d.h > 0)) {
cocos_init(d, app->activity->assetManager);
}
engine_draw_frame(engine); engine_draw_frame(engine);
} }
break; break;