java - Varias cámaras en libgdx(probablemente similares en otros marcos)
android camera (1)
He estado tratando de resolver este problema durante dos días y he renunciado a intentar encontrar una solución existente.
Empecé a aprender libgdx y terminé un par de tutoriales. Y ahora he tratado de usar todo lo que he aprendido y crear un simple juego de desplazamiento lateral. Ahora, sé que hay ejemplos de libgdx de esto, pero no he encontrado uno que incorpore Box2d con scene2d y actores, así como mapas en 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 del SpriteBatch pasada al método draw () a los actores, si esto es incorrecto corrígeme) y necesitas una cámara para el TileMapRender para llamando al método render () Además, en algunos de los tutoriales hay una OrthographicCamera en GameScreen, que se usa donde es necesario.
He intentado pasar un objeto OrthographicCamera a los métodos, he tratado de usar la cámara del escenario y la cámara de TileMapRenderer en 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 intenté usar diferentes cámaras en todos lados.
Después de probar todo esto, no he notado qué sucede exactamente, pero voy a enumerar lo que sucede:
- No hay nada en la pantalla (Probablemente la cámara está lejos de las cosas que se dibujan)
- Puedo ver el mapa en mosaico y los contornos del debugRenderer (también uso debugRender pero no creo que interfiera con las cámaras), pero el espíritu del actor no está visible (probablemente fuera de la pantalla)
- Puedo ver todo lo que debería, pero cuando intento mover el Actor y la Cámara, que se supone que debe seguirlo, el sprite va más rápido que el cuerpo (el cuadrado verde de depuración).
Entonces mis preguntas principales son:
- No entiendo lo que sucede cuando tienes varias cámaras. "A través de" ¿cuál ves realmente en el montior?
- ¿Debo usar varias cámaras y cómo?
Además, pensé que debería mencionar que estoy usando OpenGL ES 2.0.
Lamento la larga pregunta, pero pensé que debería describir en detalle, ya que es un poco complicado para mí.
Realmente ves a través de todos al mismo tiempo. Sin embargo, pueden mirar un mundo completamente diferente, pero todos rinden su punto de vista a la pantalla. Puedes usar varias cámaras, o solo una. Si usa solo uno, debe asegurarse de actualizar la matriz de proyección correctamente, entre dibujar el TiledMap, su escenario con Actores y tal vez con el Box2DDebugRenderer opcional.
Utilizaría una cámara adicional para Box2DDebugRenderer, porque puedes tirarla fácilmente más tarde. Supongo que usa un factor de conversión para convertir metros a píxeles y viceversa. Tener una relación 1: 1 no sería muy bueno. Siempre usé algo entre 1m = 16px y 1m = 128px.
Así que lo inicializa de esta manera y usa ese 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 también puede usar una cámara adicional, pero esa funcionará solo en coordenadas de pantalla, por lo que no habrá conversión:
OrthographicCamera tiledMapCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
El TiledMap siempre se representará en (0, 0). Por lo tanto, debe usar la cámara para moverse por el mapa. Es probable que siga un cuerpo, por lo que puede actualizarlo 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 a un Actor:
tiledMapCam.position.set(actor.getX(), actor.getY())
De hecho, todavía no he usado scene2d junto con Box2D, porque no necesitaba interactuar mucho con los objetos de mi juego. Necesita implementar un PhysicsActor personalizado aquí, que amplíe Actor y construya el puente de scene2d a Box2D teniendo un cuerpo como una propiedad. Tendrá que establecer la posición de los Actores, la rotación, etc. en función del Cuerpo en cada paso de actualización. Pero aquí tienes varias opciones. Puede reutilizar el tileCamCam y trabajar en coordenadas de pantalla. En este caso, debe recordar siempre multiplicar con constantes.PIXELS_PER_METER cuando actualice su actor. O usará otra cámara con la misma ventana gráfica como physicsDebugCam. En este caso, no es necesaria ninguna conversión, pero no estoy seguro de si esto podría interferir con algunas cosas específicas de scene2d.
Para un ParallaxBackground también puede usar otra cámara, para la interfaz de usuario puede usar otra etapa y otra cámara otra vez ... o reutilizar otras restableciéndolas correctamente. Es su elección, pero creo que varias cámaras no influyen mucho en el rendimiento. Menos reinicio y conversiones pueden incluso mejorarlo.
Una vez que todo está configurado, solo tiene que renderizar todo, usando las cámaras correctas y renderizando cada "capa" / "vista" una encima de la otra. Primero un ParallaxBackground, luego tu Tiledmap, luego tu Entity-Stage, luego tu vista de Box2DDebugging, luego tu UI-stage.
En general, recuerde llamar a spriteBatch.setProjectionMatrix(cam.combined);
y usando cam.update()
después de haber cambiado algo de su cámara.