studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java 2d sprite coordinate-systems libgdx

programacion - Cambiando el sistema de coordenadas en LibGDX(Java)



manual de programacion android pdf (6)

LibGDX tiene un sistema de coordenadas donde (0,0) está en la parte inferior izquierda. (como esta imagen: http://i.stack.imgur.com/jVrJ0.png )

Esto me hace golpear mi cabeza contra una pared, principalmente porque estoy portando un juego que ya había hecho con el sistema de coordenadas habitual (donde 0,0 está en la esquina superior izquierda).

Mi pregunta: ¿Hay alguna forma sencilla de cambiar este sistema de coordenadas?


Acabo de SpriteBatch una clase que amplía SpriteBatch que SpriteBatch ciertos métodos al agregar y = Gdx.graphics.getHeight() - y - height . Sencillo pero efectivo.


Biblioteca de gráficos interesantes, diría yo. Encontré esta evaluación en el siguiente enlace:

Otro problema fue que se usaron diferentes sistemas de coordenadas en diferentes partes de Libgdx. Algunas veces el origen de los ejes estaba en la esquina inferior izquierda con el eje y apuntando hacia arriba y otras veces en la esquina superior izquierda del sprite apuntando hacia abajo. Al dibujar mallas, el origen estaba incluso en el centro de la pantalla. Esto causó un poco de confusión y trabajo extra para colocar todo en el lugar correcto en la pantalla.

http://www.csc.kth.se/utbildning/kandidatexjobb/datateknik/2011/rapport/ahmed_rakiv_OCH_aule_jonas_K11072.pdf


No estoy seguro de si esto ayuda a alguien o no, pero pude obtener texturas y tipos de letra correctamente utilizando el sistema de coordenadas invertido sugerido a través de OrthographicCamera. Esto es lo que hice:

private SpriteBatch batch; private BitmapFont font; private OrthographicCamera cam; private Texture tex; @Override public void create () { batch = new SpriteBatch(); font = new BitmapFont(true); font.setColor(Color.WHITE); cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); cam.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); tex = new Texture("badlogic.jpg"); } @Override public void dispose() { batch.dispose(); font.dispose(); tex.dispose(); } @Override public void render () { cam.update(); batch.setProjectionMatrix(cam.combined); Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); font.draw(batch, "Test", 50, 50); batch.draw(tex, 100, 100, tex.getWidth(), tex.getHeight(), 0, 0, tex.getWidth(), tex.getHeight(), false, true); batch.end(); }

Las cosas importantes a tener en cuenta son:

  • El constructor de BitmapFont, el booleano voltea la fuente
  • Para batch.draw () necesitas usar todos esos parámetros porque necesitas un flipY booleano al final para voltear la textura (puedo extender SpriteBatch o hacer un método de utilidad para evitar pasar tantos parámetros todo el tiempo).
  • Observe batch.setProjectionMatrix (cam.combined); en render ()

Ahora veremos si estoy de regreso aquí más tarde esta noche haciendo modificaciones para solucionar cualquier otro problema o descubrimiento al hacer todo esto. :)


Si desea ocultar la transformación y no pensar en ella después de configurarla una vez, puede crear una clase que herede todas las funcionalidades que necesita, pero primero transforma las coordenadas antes de pasarla a la función de su clase primaria. Desafortunadamente, esto llevaría mucho tiempo.

Alternativamente, podría hacer un método que realice la transformación simple y'' = height - y en todo el objeto de Coordinate (o lo que sea que esté usando), y llamarlo una vez antes de cada operación.


Si usas una cámara (que deberías), cambiar el sistema de coordenadas es bastante simple:

camera= new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); camera.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

Si usa TextureRegions y / o TextureAtlas, todo lo que necesita hacer además de eso es call region.flip (false, true).

Las razones por las que usamos y-up de forma predeterminada (que puede cambiar fácilmente como se ilustra arriba) son las siguientes:

  • su código de simulación probablemente usará un sistema de coordenadas euclidiano estándar con y-up
  • si vas en 3D tienes y-up
  • El sistema de coordenadas predeterminado es un diestro en OpenGL, con y-up. Por supuesto, puedes cambiar eso fácilmente con un poco de magia de matriz.

Los únicos dos lugares en libgdx donde usamos y-down son:

  • Coordenadas Pixmap (origen superior izquierdo superior, y-abajo)
  • Toque las coordenadas del evento que se dan en las coordenadas de la ventana (origen superior izquierdo superior, y-abajo)

Nuevamente, puede cambiar fácilmente el sistema de coordenadas usado a lo que quiera usando una cámara o un poco de matriz matemática.


Solo para ampliar un poco lo que dijo badlogic arriba, si está usando un TextureAtlas (con TextureRegions) necesita voltearlos, como dice badlogic, además del trabajo de la cámara. Si está utilizando un TextureAtlas, puede usar este código justo después de cargar su atlas:

String textureFile = "data/textures.txt"; atlas = new TextureAtlas(Gdx.files.internal(textureFile), Gdx.files.internal("data")); // Let''s flip all the regions. Required for y=0 is TOP Array<AtlasRegion> tr = atlas.getRegions(); for (int i = 0; i < tr.size; i++) { TextureRegion t = tr.get(i); t.flip(false, true); }