Varias cámaras en libgdx (probablemente similar en otros marcos)

He estado tratando de resolver este problema durante dos días y he dejado de tratar de encontrar una solución existente.

He comenzado a aprender libgdx y he terminado un par de tutoriales. Y ahora he tratado de usar todo lo que he aprendido y crear un juego de desplazamiento lateral simple. Ahora, sé que hay ejemplos de libgdx de esto, pero no he encontrado uno que incorpora Box2d con scene2d y actores, así como mapas de mosaico.

Mi principal problema es con las cámaras.

Necesitas una cámara para el escenario (que por lo que sé se utiliza para la matriz de proyección de la SpriteBatch pasó al método draw () en los actores, si esto es incorrecto, por favor corrija) y necesita una cámara para el TileMapRender para Llamando al método render (). Además, en algunos de los tutoriales hay una cámara ortográfica en la pantalla de juego, que se utiliza donde sea necesario.

He intentado pasar un objeto de OrthographicCamera a los métodos, he intentado utilizar la cámara de la etapa y la cámara del TileMapRenderer por todas partes. Ex.

OrthographicCamera ocam = new OrthographicCamera(FRUSTUM_WIDTH, FRUSTUM_HEIGHT); stage.setCamera(ocam); // In the other cases i replace ocam with stage.getCamera() or the one i use for the tileMap Render tileMapRenderer.render(ocam); stage.getSpriteBatch().setProjectionMatrix(ocam.combined); // I am not sure if this is needed 

También he intentado utilizar cámaras diferentes por todas partes.

Después de intentar todo esto no he notado lo que sucede exactamente cuando pero voy a enumerar lo que sucede:

  • No hay nada en la pantalla (Probablemente la cámara está lejos de las cosas que se dibuja)
  • Puedo ver el mapa de mosaico y los contornos de la debugRenderer (yo uso debugRender demasiado, pero no creo que interfiera con las cámaras), pero el sprite del actor no es visible (probablemente fuera de la pantalla)
  • Puedo ver todo lo que debo hacer pero cuando trato de mover al Actor ya la Cámara, que se supone que debe seguirlo, el sprite va más rápido que el cuerpo (la cuadrícula verde de depuración).

Así que mis principales preguntas son:

  • No entiendo qué sucede cuando tienes varias cámaras. "¿A través de" cuál uno realmente ves en el montior?
  • ¿Debo usar múltiples cámaras y cómo?

Además, pensé que debo mencionar que estoy usando OpenGL ES 2.0.

Lo siento por la larga pregunta, pero pensé que debería describir en detalle, ya que es un poco complicado para mí.

Usted realmente ver a través de todos ellos al mismo tiempo. Podrían mirar un mundo completamente diferente, sin embargo, pero todos ellos dan su punto de vista a la pantalla. Puede utilizar varias cámaras, o sólo una. Si usa sólo uno, debe asegurarse de que actualiza correctamente la matriz de proyección, entre dibujar el TiledMap, su escenario con actores y tal vez para el Box2DDebugRenderer opcional.

Utilizaría una cámara adicional para el Box2DDebugRenderer, ya que se puede tirar más tarde. Supongo que utiliza un factor de conversión para convertir metros a píxeles y al revés. Tener una proporción de 1: 1 wouldnt ser muy bueno. Siempre he usado algo entre 1m = 16px y 1m = 128px.

Así que lo inicializa de esta manera, y el uso que uno para su procesador de depuración:

 OrthographicCamera physicsDebugCam = new OrthographicCamera(Gdx.graphics.getWidth() / Constants.PIXEL_PER_METER, Gdx.graphics.getHeight() / Constants.PIXEL_PER_METER); 

Para su TiledMapRenderer usted puede utilizar una cámara adicional, así, pero que uno trabajará en coordenadas de pantalla sólo, por lo que no hay conversión:

 OrthographicCamera tiledMapCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

El TiledMap siempre se renderizará en (0, 0). Así que usted necesita para usar la cámara para moverse en el mapa. Es probable que siga un cuerpo, por lo que puede actualizar a través de:

 tiledMapCam.position.set(body.getPosition().x * Constants.PIXELS_PER_METER, body.getPosition().y * Constants.PIXELS_PER_METER) 

O en caso de que siga un actor:

 tiledMapCam.position.set(actor.getX(), actor.getY()) 

De hecho, no he usado scene2d junto con Box2D, porque no necesitaba interactuar mucho con mis objetos de juego. Es necesario implementar un PhysicsActor personalizado aquí, que extiende Actor y construye el puente de scene2d a Box2D por tener un cuerpo como una propiedad. Tendrá que establecer la posición de los Actores, la rotación, etc basado en el Cuerpo en cada paso de actualización. Pero aquí tienes varias opciones. Puede volver a usar la función tiledMapCam y trabajar en coordenadas de pantalla. En este caso, siempre debe recordar multiplicar con Constants.PIXELS_PER_METER al actualizar su actor. O usted utilizará otra leva con la misma viewport como el physicsDebugCam. En este caso, no se necesita ninguna conversión, pero no estoy seguro si esto podría interferir con algunas cosas específicas de scene2d.

Para un ParallaxBackground también puede utilizar otra cámara, para la interfaz de usuario puede utilizar otra etapa y otra cámara de nuevo … o reutilizar a otros por restablecer correctamente. Es su elección, pero creo que varias cámaras no influyen mucho en el rendimiento. Menos restablecimiento y conversiones podrían mejorarlo.

Después de que todo esté configurado, sólo tiene que renderizarlo todo, usando las cámaras correctas y renderizar cada "capa" / "vista" una encima de la otra. Primero un ParallaxBackground, luego tu Tiledmap, luego tu Entity-Stage, luego tu vista Box2DDebugging y luego tu UI-stage.

En general, recuerde llamar a spriteBatch.setProjectionMatrix(cam.combined); Y usando cam.update() después de cambiar algo de su cámara.

  • OpenGL ES 2.0 Error al asignar correctamente el atributo de color
  • GLSL ES falla las variables locales?
  • La mejor práctica para usar Sprites en un juego usando AndEngine GLES2
  • GlDepthMask (GL_FALSE) trashes el búfer de cuadros en algunas GPUs
  • For-loop en código de sombreado que trabaja con un número codificado pero no con una variable uniforme
  • Irrlicht android en opengl es 2.0 driver
  • Convertir la textura procesada de OpenGL ES 2.0 en mapa de bits y volver
  • Pasando varias texturas a shader en LibGDX
  • Usar el indicador de hardwareAcceleration con Canvas.clipPath
  • Las aplicaciones de Android OpenGL dejan de funcionar después de cargarlas en el emulador
  • OpenGL ES 2.0 texture2D sesgo / lod
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.