lunes, 29 de febrero de 2016

Tutorial 2: Aplicar dinamismo.

Bienvenidos sean todos.
En el presente tutorial tratare de explicar de la mejor forma xD
Este tutorial es la continuación del primero aqui

Comenzamos:
Podemos navegar por los proyectos en eclipse, comencemos con tuto1-android:

En la carpeta src, esta la clase AndroidLauncher, la cual observamos, el siguiente codigo:
package sv.chuckles.tuto1;

import android.os.Bundle;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import sv.chuckles.tuto1.Tuto1;

public class AndroidLauncher extends AndroidApplication {
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
initialize(new Tuto1(), config);
}
}

No hay nada inusual, podemos observar que la clase extiende de AndroidApplication , que es propia de LibGDX y controla las actividades. Otro punto importan es el método "initialize", el cual instancia la Clase Tuto1, que es nada mas que la clase principal del proyecto CORE. Si observan no se programa en Android, simplemente si instancia la programacion del CORE.
Un dato muy importante es la carpeta "assets", es donde LibGDX busca nuestras imagenes, sonidos, musica o archivos que utilicemos.

Es el turno tuto1-desktop: Al igual que en el proyecto de android, existe una clase principal llamada: "DesktopLauncher" y es su parte homologa, en ella se instancia la clase principal Tuto1, donde es la programacion principal de nuestro juego.

package sv.chuckles.tuto1.desktop;

import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import sv.chuckles.tuto1.Tuto1;

public class DesktopLauncher {
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
new LwjglApplication(new Tuto1(), config);
}
}

NOTA: El objeto "config" tiene las configuraciones básicas, luego veremos algunas.

Por ultimo la mas importante, tuto1-core:
package sv.chuckles.tuto1;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class Tuto1 extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
@Override
public void create() {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
}

@Override
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(img, 0, 0);
batch.end();
}
}

Aquí esta la esencia de todo.
Explicación:
  1. La clase hereda de ApplicationAdapter, es un clase que nos proporciona LibGDX, donde esta definido el ciclo de vida de la aplicación.
  2. SpriteBatch batch, este objeto se encarga de renderizar todos los componente graficos.
  3. Texture img, bueno, no creo que necesite explicacion, es simplemente una textura/imagen.
  4. create(), este metodo instancia el batch y la textura. Si somos observadores la textura recibe de parametro el nombre de la imagen, por defecto la imagen "badlogic.jpg" es buscada en la carpeta asset del proyecto de android.
  5. render(), este método es el mas importante, ya que es el encargado de estar leyendo, escribiendo estados, pintando imágenes, letras, etc. Este método es ejecutado por un hilo, siempre esta corriendo.
  6. Gdx.gl.glClearColor(1, 0, 0, 1);, esta linea es una de las dos de openGL que vamos a escribir. Se encarga de poner un color de fondo en forma de (R,G,B).
  7. Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);, esta linea es la ultima que vamos a escribir en OpenGL lo juro. Esta instrucción le dice a LibGdx que rellene toda la pantalla del color de la instrucción anterior.
  8. batch.begin();, inicia bloque de dibujar en pantalla.
  9. batch.draw(img, 0, 0);, pinta la imagen "badlogic.jpg", en la posición (x=0,y=0). LibGdx utiliza el primer cuadrante del plano carteciano.
  10.  batch.end();, finaliza bloque de pintado en pantalla.
Haremos un pequeño cambio, a la forma de pintar nuestra imagen, actualmente se hace por medio de Texture, la cambiaremos por Sprite. Las imágenes son estáticas mientras los sprite tiene dinamismo, poseen posición, color, rotación, etc.

En clase Sprite, su constructor recibe un parámetro una Texture, así que le pasaremos nuestra textura. Y la posicionaremos en la poscion x=200 e Y=100.
Para dibujar nuestro sprite, usaremos el método .draw del Sprite:
package sv.chuckles.tuto1;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class Tuto1 extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
Sprite sprite;
@Override
public void create () {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
sprite = new Sprite(img);
sprite.setPosition(200, 100);
}

@Override
public void render () {
Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
sprite.draw(batch);
batch.end();
}
}

Ejecutemos este código:

Podemos hacer pruebas con diferentes métodos, agreguemos esta linea:
sprite.setScale(0.75f);
Después de la linea 20, este método escala nuestra imagen en 75%, corremos, observamos:

Agreguemos la siguiente linea: sprite.setRotation(45);
Después de la linea 21, este sentencia rota nuestra imagen en 45 grados:

Si nos hemos dado cuenta, todo estas configuraciones son el constructor, vamos hacer que rote indefinidamente. Para tal efecto programaremos en el método render:
public void render () {
float rotar = 5;
Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
rotar += sprite.getRotation();
if(rotar > 360) rotar = 5;
sprite.setRotation(rotar);
sprite.draw(batch);
batch.end();
}
Creamos una variable rotar con 5 grados, luego acumulamos el valor de rotar con el valor del sprite, después preguntamos si rotar supera los 360 grados, si es verdadero rotar tiene el valor inicial de 5 grados, al ejecutar el código, la imagen debe girar.

Para finalizar moveremos la imagen, leída del teclado, para el siguiente tutorial haremos mover la imagen con el giroscopio para el proyecto en Android.
LibGdx utiliza una clase estática llamada "Gdx", la cual nos proporciona mucha información, de la aplicación, inputs, archivos, audio, gráficos, etc. Esta clase nos proporciona un método llamado: isKeyPressed la cual busca si una tecla es presionada, así que agregaremos esta función en el método render, si presionamos la tecla izquierda le quitaremos 5 pixeles, y si presionamos la tecla derecha le sumaremos 5. De igual forma si presionamos la tecla arriba le sumamos 5 pixeles y por el contrario le restamos 5.
Nuestro código fuente quedaría así:

package sv.chuckles.tuto1;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class Tuto1 extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
Sprite sprite;
@Override
public void create () {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
sprite = new Sprite(img);
sprite.setPosition(200, 100);
sprite.setScale(0.75f);
sprite.setRotation(45);
}

@Override
public void render () {
float rotar = 5;
Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
rotar += sprite.getRotation();
if(rotar > 360) rotar = 5;
if(Gdx.input.isKeyPressed(Keys.LEFT)){
sprite.setX(sprite.getX()-5);
}else if(Gdx.input.isKeyPressed(Keys.RIGHT)){
sprite.setX(sprite.getX()+5);
}
if(Gdx.input.isKeyPressed(Keys.UP)){
sprite.setY(sprite.getY()+5);
}else if(Gdx.input.isKeyPressed(Keys.DOWN)){
sprite.setY(sprite.getY()-5);
}
sprite.setRotation(rotar);
sprite.draw(batch);
batch.end();
}
}

Ya con todo lo visto, hemos aprendido muchos conceptos, en las posteriores entregas no serán tan técnicas xD
Para el próximo tutorial veremos como implementar el movimiento con giroscopio para el mismo ejemplo.

Un Saludo 

Sigueme en Twiter: https://twitter.com/libgdxESA

Si te gusta mi trabajo y quisieras ver mas y mas rápido, puedes donar $1.00 vía donación paypal:





Tutorial 1: El Gran Inicio.

Sean bienvenidos al primer tutorial de LibGDX.
En el anterior turorial, hemos visto las configuraciones básicas para que funcione LibGDX.
En este presente, construiremos un proyecto y modificaremos para demostrar conceptos basico.
Bueno manos a la obro.
Primero creare una carpeta llamada: "C:\workspace_tutoriales\" en la raiz "C", esta sera mi repositorio para eclipse. Abrimos eclipse y pondremos esta carpeta como nuestro Workspace(Espacio de trabajo), si ya lo tiene configurado pueden cambiarlo en File->Switch Workspace.

Anteriormente habias descargado LibGDX de aqui, hay que extraer la carpeta en un lugar facil de recordar, en mi caso cree una carpeta llamda: "libgdx-nightly-20160209" en la raiz de "C", ahi hay que colocar todos los archivos que contenga el zip.
Nota: Hemos descargado la version  nightly, porque en ella están las herramientas de soporte y documentación. Pueden descargar solo el "gdx-setup.jar", pero cuando veamos la seccion de empaquetado de imagenes, sistemas de particulas, generador de Bitmap font, etc. Deben de descargarlos aparte.

Ejecutamos el archivo: "gdx-setup.jar", y completamos la informacion requerida, asi.
Name: tuto1
Package: sv.chuckles.tuto1
Game Class: Tuto1
Destination: C:\workspace_tutoriales\tuto1
Android SDK: C:\Program Files (x86)\Android\android-sdk
Sub Projects:
Desktop, Android


En la seccion de Android SDK, si no esta lleno, buscarlo por el boton.
Presionamos el boton "Generate"
Esto tardara un poco, ya que descarga las dependencias del proyecto, al fin saldrá esto, lo que significa que ya esta creado el proyecto.

Nos vamos a eclipse, y elegimos la opcion: File->Import->Gradle->Gradle Project  y boton Next
Presionamos el boton Browse.. o pegasmos la direccion del proyecto, luego presionamos el boton "Build Model", seleccionamos los tres proyectos y presionamos "Finish"


Veremos que en el panel aparecen tres proyectos:
  1. tuto1-android
  2. tuto1-core
  3. tuto1-desktop
Es aquí cuando vemos la separacion del multiplataforma, El mas importante es el "Core", es donde programamos todo y este se vincula a todos los proyectos, para nuestro caso el de android y el de desktop.

Podemos correr nuestro primer proyecto. Vamos a ejecutar la version Desktop, para ello, damos click derecho sobre el proyecto tuto1-desktop: Run As->Java Application, nos preguntara cual es la clase principal, elegimos: "DesktopLauncher":
Felicidades ya tienes tu primera pantalla xD

Hagamos otra prueba, corramos para android xD
Si tienen su Smartphone pueden probarlo ahi, yo lo hare con el emulador: "Genymotion"
Damos click derecho sobre: "tuto1-android": Run as->Android Application
Elegimos nuestro dispositivo o nuestro emulador:
Presionamos OK y nos aparecera:

Ya con esto podemos ir imaginando como va el asunto.
En el proximo tutorial, vemos como el codigo fuente que nos a generado y como manupularlo.
Un saludo
Sigueme en Twiter: https://twitter.com/libgdxESA

Si te gusta mi trabajo y quisieras ver mas y mas rápido, puedes donar $1.00 vía donación paypal:


Tutorial 0: Preparando todo.

LibGDX - Desarrollo de Videojuegos

Bienvenido a una series de tutoriales con el fin de programar videojuegos para smartphone. Con este gran framework de desarrollo de videojuegos basado en JAVA y multiplataforma.

Objetivos:
      1Conocer LibGDX.
      2. Requisitos.
      3. Consideraciones.
      4. Entorno de desarrollo.

1. Conocer LibGDX.
LibGDX es un framework escrito en JAVA, el cual nos proporciona una gran gama de funciones para del desarrollo multiplataformas de nuestros juegos.
LibGDX funciona bajo OpenGL, y están versátil que tu puedes programar todo sin saber de OpenGL.
Para un mayor detalle revisar: libGdx-Features
Entre las bondades que nos proporciona la herramienta esta: Manejo de sistemas de partículas, motor de física(box2D), mostrar mapas basados en Tiled, entre otras. Iremos viendo cada una de ellas en el futuro.

2. Requisitos.
Para poder seguir paso a paso estos tutoriales, debes cumplir estos requisitos:
  • Saber programar en JAVA.
  • Tener instalado Android SDK.
  • Tener muchas pero muchas ganas de aprender.
3. Consideraciones.
En vista que no poseo una MAC y un IPhone, estos tutoriales serán orientados para Desktop y Android. Yo utilizo Windonw$ 7 y 8. 
Utilizo Eclipse Mars, ustedes pueden utilizar el que mas les parezca.
Todos los códigos fuentes finales serán publicados en Github.
También considero que ya saben programar en java, por lo tanto no explicare programación OO, solo lo que sea del framework.

4. Entorno de desarrollo.
Si haz llegado a este punto, pues eres programador de JAVA y debes tenes ya en tu maquina el JDK de JAVA xD
Para tener instalado y configurado, debes de tener listo:
  1. Instalado JDK 7+ y configurado el JAVA_HOME
  2. Instalado SDK Android y configurado el ANDROID_HOME
  3. Eclipse Mars o superiores.
  4. Para estos tutoriales utilizaremos la version 1.9.2 de libGDX, si para el momento que haz encontrado esto ya ha pasado algun tiempo, puede descargar la version 1.9.2 Libgdx-releases
Teniendo todo esto, abrimos nuestro eclipse, y tendremos que instalar el plugin de gradle, para ello
vamos al menu: help->Install New Software...  Presionamos el boton Add y escribimos:
Name: Gradle


Así lo tenemos listo ya nuestro plugin de gradle.

En la version 1.9.2 de Libgdx funciona con el api 19(Android 4.4.2), asi que deben de actualizar su android SDK a esta api.

Recuerden que deben tener todas las variables configuradas, para que funcione sin problema.
Ya con esto hemos finalizado esta parte.
En el siguiente tutorial crearemos un pequeño ejemplo, para ver conceptos basicos.
Un saludo.
Sigueme en Twiter: https://twitter.com/libgdxESA

Si te gusta mi trabajo y quisieras ver mas y mas rápido, puedes donar $1.00 vía donación paypal: