De nuevo seguimos con este tutorial sobre como crear un juego para Android / iOS usando Java y el framework libGDX
Todo juego debe tener 2 cosas, imagenes y sonidos asi que lo que vamos a hacer es conseguir estos assets y meterlos en nuestro proyecto
Imagenes para nuestro juego android
La forma mas facil de encontrar las imagenes es buscando en Google. Despues de un rato buscando por la red encontre unas imagenes en formato SVG de las fichas del Tetris
Estas imagenes, al ser escalables, podemos cambiar su tamaño sin perder calidad. Para esta tarea podemos usar el programa Inkscape que trabaja con este tipo de archivos. Como esto no es un tutorial de Inkscape asumire que tenemos las imagenes SVG exportadas a formato PNG que es el que usaremos
Una vez tengamos los archivos png vamos a usar la herramienta GDX Texture Packer para crear un Texture Atlas de los bloques. Es muy sencilla de usar pero si teneis dudas podeis mirar en la wiki para conocer todas las opciones que teneis
Este programa nos generara 1 archivo .atlas y uno o varios archivos .png. Estos archivos los usaremos mas adelante en nuestro codigo. El archivo .atlas es un «mapa» donde se le indica en que archivo png y en que posicion dentro de el estan cada una de las imagenes para luego poder usarlo con la libreria y renderizarlo en la pantalla
Musica para el juego
En Internet Audio Archive podeis encontrar musica para el Tetris buscando por el tag
Podeis usar cualquiera pero recordad que si quereis usarla en un juego que vais a distribuir la licencia deberia ser Creative Commons
Usando los assets en el juego
Empecemos a usar nuestros assets en el juego. Para ello, vamos a comenzar insertando la musica. En la carpeta assets del proyecto Android vamos a crear una carpeta llamada sounds y vamos a copiar aqui nuestra musica
Una vez copiado editaremos la clase TetrisGame quedando de la siguiente manera
package es.rubenjgarcia.tetris; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.graphics.GL20; public class TetrisGame extends ApplicationAdapter { private Music music; @Override public void create () { music = Gdx.audio.newMusic(Gdx.files.internal("sounds/tetris.mp3")); music.setLooping(true); music.play(); } @Override public void render () { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); } @Override public void dispose() { super.dispose(); music.dispose(); } }
Creamos el objeto Music y le decimos que queremos que cuando acabe vuelva a empezar con el metodo setLooping pasando el valor true
Para liberar el fichero y no dejarlo abierto cuando cerremos la aplicacion se usa el metodo dispose
Si ejecutamos el programa mediante la clase DesktopLauncher podremos ver la pantalla en negro y la musica de fondo
Lo siguiente que haremos sera añadir las imagenes, para ello crearemos una carpeta en la carpeta assets del proyecto android llamada images y copiaremos los archivos .png y el archivo .atlas que generamos antes
En mi archivo .atlas he definido los nombres de las regiones como S,Z,J,L,I,O y T cada uno representando la forma de la pieza. Para dibujar en la pantalla una pieza de tipo S el codigo seria el siguiente
package es.rubenjgarcia.tetris; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureAtlas; public class TetrisGame extends ApplicationAdapter { private Music music; private TextureAtlas blocks; private SpriteBatch batch; @Override public void create () { music = Gdx.audio.newMusic(Gdx.files.internal("sounds/tetris.mp3")); music.setLooping(true); music.play(); blocks = new TextureAtlas(Gdx.files.internal("images/blocks.atlas")); batch = new SpriteBatch(); } @Override public void render () { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); batch.draw(blocks.findRegion("S"), 0, 0); batch.end(); } @Override public void dispose() { super.dispose(); batch.dispose(); music.dispose(); blocks.dispose(); } }
Sencillo, no? Solo tenemos que buscar nuestra region con el metodo findRegion de la clase TextureAtlas y pasarla a nuestro SpriteBatch que sera el encargado de pintarla
Si queremos girarla podemos hacerlo cambiando el codigo del metodo render por el siguiente
@Override public void render () { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); Sprite sSprite = new Sprite(blocks.findRegion("S")); sSprite.setRotation(90); sSprite.draw(batch); batch.end(); }
Usando la clase Sprite para generar nuestra imagen y el metodo setRotation pasandole el numero de grados podemos rotar nuestras piezas. En proximos tutoriales veremos todo esto con mas detalle
Como siempre teneis los archivos del proyecto en el repositorio github creado para el tutorial