miércoles, 6 de marzo de 2013

Trabajando Git (I)

Como el proyecto ha tomado un matiz colaborativo entre unos amigos de la facultad. Se ha hecho necesario el utilizar una herramienta de control de versiones y de asignación de tareas. Para poder solucionar eso hay diferentes herramientas como Subversion o Git, usando en nuestro caso la última.

Lo primero que necesitamos es un sitio donde poder hospedar todo este tinglado así que vamos a ello. Existen muchas alternativas gratuitas y otras tantas de pago, pero elegí Github porque es una de las más conocidas. Otra bastante buena es Bitbucker. Bueno, una vez elegida, nos registramos y creamos el repositorio -o nos unimos a uno ya existente mediante invitación del administrador del mismo-. Una vez hecho esto ya tenemos lista nuestra nube, ahora... a por la instalación en el IDE.

Al ser en Java y por las facilidades que da, estoy usando Eclipse. Bien, hay que hacerse a él pero es como otro cualquiera, una vez que te acostumbras a sus cosas es muy útil y te ahorra bastante tiempo. Pero no es su uso general lo importante ahora mismo, sino su integración con Git. Así que vamos a ello.

Lo primero es instalar la extensión adecuada, para ello nos vamos a Help-> Install new software. Una vez dentro de la ventana, seleccionamos el repositorio desde el cual va a descargar la lista de paquetes, normalmente sólo tendréis uno, el de Indigo.
Bien, en el campo de búsqueda introducimos la palabra EGit e instalamos el paquete de ese mismo nombre y el de Mylyn. Una vez hecho, nos pedirá reiniciar el programa. Lo hacemos y ya estamos listos para poder usar Git. En mi caso, ya estaba el proyecto hecho, con lo que el proceso será diferente (ya lo explicaré en otra entrada). Los pasos son los siguientes.

Nos vamos al menú File -> Import y ahí seleccionamos: Git -> Projects from Git. Después seleccionamos URI y pegamos la dirección que nos aparece en nuestro repositorio en Github para su descarga, está en la sección de Code. Bien, una vez pegada nos rellenará los datos, sólo nos queda poner nuestras credenciales.

Después nos dará a elegir qué ramas de desarrollo queremos elegir, en mi caso tengo dos, pero ya es como vosotros os organicéis. Acto seguido elegimos dónde guardar el proyecto. En el siguiente paso tuve problemas que ya fueron solucionados. La cosa es la siguiente, si en el repositorio ya está entero en GitHub (o similar) tenéis que seleccionar la primera opción. La segunda es para crear uno nuevo mediante un ayudante y el tercero es para utilizar los archivos como un proyecto cualquiera, sin saber en qué lenguaje está hecho.

El problema fue que elegimos la última opción y claro, no lo reconocía como proyecto en Java y ahí empezaron problemas con el compilador y las ayudas del IDE. Solucionado con elegir la opción que veis en la imagen superior.

Pues bien, una vez hecho esto se os descargarán los archivos que estén en el repositorio y podréis poneros a trabajar. Queda ahora por explicar cómo funciona Git de una forma muy básica, no me ha dado tiempo de más, pero se irá ampliando la información.


Libgdx


Como es el primer proyecto que hago, no tengo aún muy claros cómo hay que hacer las cosas y en qué orden hay que hacer los pasos. Así que después de tener claro cómo hacer la parte de las conexiones, al menos por el momento, estuve dando vueltas ayer a cómo plantear la interfaz y qué herramientas utilizar para ello. Gracias a un compañero ya tengo la respuesta. Se trata de Libgdx (aquí su página).
No he tratado mucho con ella, empecé ayer y no ha dado tiempo para nada claro. Pero sí he podido ver que hay mucha comunidad detrás de ella y que, como me ha dicho otro compañero, es potente y hay mucho donde rascar ahí dentro.
Así que… decisión tomada. Estaré estos días viendo cómo funciona y trasteando con ella, espero salir bien parado.

Servidores y conexiones


Estos primeros días estoy comprobando cómo va el tema de las conexiones. Al ser un juego en el que todos los datos se van a procesar en un servidor central tenía que buscar la forma de que el servidor pudiera comunicarse con los diferentes clientes.
La solución a eso venía dada por la técnica llamada Callback. Que consiste, básicamente, en que el servidor guarde un lista con las referencias a los clientes y que mediante una lista de métodos que el cliente implementa mediante una interfaz se comunique. Hay que buscar una forma de que el servidor guarde esas referencias. Para registrarlo basta con mandar, en un método específico para ello, una referencia a un objeto que implemente dicha interfaz del cliente que posteriormente se guardará en alguna estructura en el código que implementa las interfaces del servidor.
Bien. Una vez conseguido ésto, que el cliente pueda registrarse en un servidor y borrarse, se me ocurrió que sería buena idea hacer que los servidores no fueran fijos sino que hubiera una lista con los disponibles y que el cliente eligiera a cuál conectarse.
Para ello, utilicé un apaño que consiste en lo siguiente. Guardé en Dropbox (o cualquier otro servicio donde puedas descargar un fichero sin necesidad de cuenta) un fichero de texto con las direcciones IP -o direcciones completas ya formateadas para RMI, o con los datos que veas oportuno- teniendo ya una especia de repositorio donde tener el registro de ellos. Bueno, una vez hecho esto, desde el cliente procedo a su descarga y lectura, guardando en mi caso cada línea como un elemento en un Array de String. Luego es cuestión de que el usuario elija el servidor que quiera y ya se conecta a él.
De esta forma ya he conseguido tener resuelta la parte de las conexiones. Ahora ya es dedicarme al tema de cómo funciona el juego por dentro y definir correctamente los métodos necesarios que el servidor y el cliente necesitarán.

Blackjack en Java


Después de cursar este año la asignatura Programación Concurrente y de Tiempo Real y verla útil e interesante, he decidido hacer mi primer videojuego. Como aún estoy aprendiendo y ahora mismo, justo después de los exámenes, no tengo muchas ideas decidí hacer el famoso Blackjack en Java, con RMI e interfaz gráfica.
Esta página servirá para ir dejando constancia de mi desarrollo y de cómo voy planteando las cosas y cómo las soluciono. Seguramente haya muchas cosas hechas de mala manera, ineficientes y probablemente anticuadas. Pero no pretendo que sea perfecto ahora mismo, sólo que sea funcional. Una vez hecho éso sí que me pondría a mejorarlo. 
De momento, me conformo con aprender.