Cómo forzar el modo de paisaje con NDK utilizando códigos C ++ puros

En general, funciona bien. Pero si bloqueo la pantalla, y esperar APP_CMD_LOST_FOCUS ocurren, y luego desbloqueo el srceen. ¡Cambia a retrato! Pero yo encuentro el buff del egl sigue siendo ajuste del paisaje, y todo el coordenada más grande.

Mi configuración de AndroidManifest.xml:

<activity android:name="android.app.NativeActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:configChanges="orientation|keyboardHidden" android:screenOrientation="landscape" android:clearTaskOnLaunch="true"> <meta-data android:name="android.app.lib_name" android:value="sunred" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

Mi código init cgl de egl

 int engine_init_display(OSCONTEXTENGINE* pEngine, const DISPLAY_CONFIG* pConfig) { // initialize OpenGL ES and EGL /* * Here specify the attributes of the desired configuration. * Below, we select an EGLConfig with at least 8 bits per color * component compatible with on-screen windows */ const EGLint attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_NONE }; EGLint w, h, dummy, format; EGLint numConfigs; EGLConfig config; EGLSurface surface; EGLContext context; EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(display, 0, 0); //eglBindAPI(EGL_OPENGL_ES_API); /* Here, the application chooses the configuration it desires. In this * sample, we have a very simplified selection process, where we pick * the first EGLConfig that matches our criteria */ EGLBoolean bres = eglChooseConfig(display, attribs, &config, 1, &numConfigs); if (!bres) { __android_log_print(LOGINFO_ERROR, "engine_init_display", "numConfigs = %d", numConfigs); } /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is * guaranteed to be accepted by ANativeWindow_setBuffersGeometry(). * As soon as we picked a EGLConfig, we can safely reconfigure the * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */ eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); ANativeWindow_setBuffersGeometry(pEngine->m_app->window, 0, 0, format); surface = eglCreateWindowSurface(display, config, pEngine->m_app->window, NULL); const EGLint ai32ContextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; context = eglCreateContext(display, config, NULL, ai32ContextAttribs); if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) { LOGW("Unable to eglMakeCurrent"); return P_ERR; } eglQuerySurface(display, surface, EGL_WIDTH, &w); eglQuerySurface(display, surface, EGL_HEIGHT, &h); pEngine->m_EglDisplay = display; pEngine->m_EglContext = context; pEngine->m_EglSurface = surface; pEngine->m_iWidth = w; pEngine->m_iHeight = h; return 0; } 

Cuando se produce APP_CMD_INIT_WINDOW, llamo engine_init_display.

Tiene algún método para obligar a establecerlo en el modo de paisaje con c + +?

El marco de renderizado:

Funciona bien

 pEngine->m_iWidth = 960; pEngine->m_iHeight = 540; 

Lock screeen -> APP_CMD_LOST_FOCUS -> desbloqueo de la pantalla

 pEngine->m_iWidth = 540; pEngine->m_iHeight = 960; 

Las ventanas cambian al retrato! Pero el buff del egl sigue siendo ajuste del paisaje, y todo el coordenada más grande.

One Solution collect form web for “Cómo forzar el modo de paisaje con NDK utilizando códigos C ++ puros”

Cuando obtenga APP_CMD_CONFIG_CHANGED, intente hacer otro init:

  case APP_CMD_CONFIG_CHANGED: if (engine->app->window != NULL && ((engine->width != ANativeWindow_getWidth(app->window)) || (engine->height != ANativeWindow_getHeight(app->window)))) { engine_handle_cmd(app, APP_CMD_TERM_WINDOW); engine_handle_cmd(app, APP_CMD_INIT_WINDOW); } break; 

(Nombres de variables, etc. del código de ejemplo de NativeActivity.) Usted terminará pasando por init varias veces en wake; Si esto es un problema, también puede hacer init lento e invalidar la configuración en APP_CMD_CONFIG_CHANGED y APP_CMD_INIT_WINDOW.

Esto es del código vivo; En nuestras pruebas, funciona cerca del 99% del tiempo en 2.3 y posteriores (no probado antes), pero una cantidad muy pequeña del tiempo que inicia el programa desde la pantalla de bloqueo y luego desbloquear provoca una condición de competencia en la que CONFIG_CHANGED no se llama Y nos despertamos atascados en el paisaje. Para nuestro juego, esto no es una ruta de código de usuario (que se inicia desde la pantalla de bloqueo), así que no he investigado más.

  • Pantalla en negro en lugar de multi-textura
  • Monitor de GPU de Android Studio no funcionará para OpenGLES2
  • Entorno de práctica recomendado para OpenGL ES 2.0?
  • OpenGL ES profundidad buffer android, no puede llegar a trabajar
  • Modificación de la salida de la cámara con SurfaceTexture y OpenGL
  • Problema de detección de colisiones basado en píxeles con OpenGLES 2.0 bajo Android
  • AndEngine - Kill Sprite después de X segundos?
  • Error al intentar obtener Alraedy creado Surface y recibir EGLNativeWindowType ya conectado a otro error de API
  • OpenGL ES 2.0 texture2D sesgo / lod
  • Mostrar un texto como textura con OpenGL ES 2.0
  • Cómo implementar gesto multitouch en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.