Un poco de brainstorm

El equipo de Vands se ha dado cuenta de que, para poder sacar esto adelante, hace falta pulir un par de ideas relacionadas directamente con las reglas del juego.

Hasta ahora no hemos contestado a la simple pregunta de: ¿qué hay que hacer?. Ya va siendo hora de aclarar un poco la idea del proyecto.

En primer lugar, algunos han preguntado si será una red orientada a tocar online a través de streaming: en principio no. El hecho de tener que tocar ya condiciona al usuario a disponer de un instrumento musical, a saber tocarlo y a querer tocarlo. O lo que es lo mismo, una persona que no sepa tocar nada no podría jugar por mucho que le guste la música y la idea. Aunque no decimos que no a dar al usuario la oportunidad de hacerlo de forma complementaria. Todo esto está abierto a opiniones.

Pero hablemos de lo que Vands SI será.

Punto uno: el juego es social. Esto significa que para progresar en el juego será necesaria la interacción entre usuarios. No me gusta comparar ni hacer copias mediocres de ideas que ya existen pero, por lo general, es lo que mejor funciona a la hora de visualizar lo que tenemos en mente. Supongo que a todo el mundo le sonará «Los Sims Social» de facebook (al que no participe directamente en el juego, le habrán llegado peticiones a punta de pala). Un sim usuario de facebook te invitará a que cortes su cesped para establecer una especie de simbiosis. La idea es bastante parecida: yo soy un usuario, formo una banda contigo, programamos un concierto (que no será otra cosa que una animación) e invitamos a otros tantos usuarios que igualmente saldrán beneficiados del asunto.

Punto dos: el juego es un rpg, como los mismos sims no dejan de ser. Esto significa: si quieres avanzar tendrás que mejorar tu habilidad y tu equipo. Cada aspecto se considerará a nivel individual y a nivel de banda. Por ejemplo, la popularidad de tu banda dependerá de tu popularidad como músico y de la de tus compañeros. El dinero que gane tu banda dependerá de su performance en un concierto, y esto a su vez dependerá de las horas que tu banda practique, así como de la calidad de su equipo. Este dinero te permitirá comprar nuevo material, etc.

Punto tres: el juego es sobre música. Sin violar en ningún momento los derechos de privacidad de nadie, la red está basada en instrumentos reales. Esto permitirá que los usuarios puedan debatir acerca de la calidad de cualquiera de ellos. En la red existirá una tienda de cd’s y vinilos basada en discos reales con el que cada usuario podrá reunir su propia colección. Por ello también cabrá la opción de hacer la crítica de un LP determiado. Si tienes un grupo en tu vida real, podrás incluir tus cd’s en la tienda, ofrecer tu imagen para crear posters que los usuarios puedan usar para decorar sus paredes o cualquier otro tipo de información que sirva para promocionarte. Este tercer punto viene a resumirse en que Vands también es una herramienta que permite a sus participantes compartir conocimientos musicales.

El propósito de este post es animar a la gente a que de su opinión y también, como ya dijimos en la primera entrada, a aportar sus ideas para darle mayor jugabilidad al tema. Se contestará cualquier duda del tipo «¿y qué habéis pensado para …?». ¡A ver si le damos forma a esto de una vez!

Publicado en General | 8 comentarios

Probando la interfaz

Hace unos días montamos un par de pizarras táctiles y aproveché para probar la interfaz. Aunque la aplicación puede parecer un amasijo de vistas y poco más, todo tiene su función y la estructura que les da sentido poco a poco va tomando forma!

Publicado en General | Deja un comentario

Integrando Django con Html5

En el anterior post intentamos explicar el mecanismo del elemento «canvas» de html5. Ahora bien, cada usuario de Vands mantendrá una configuración diferente al resto. Por ello, tanto el conjunto de elementos que forman una vista como su disposición en la escena, variarán en función del desarrollo de cada jugador. ¿Cómo es posible adaptar nuestra animación a cada usuario?

Javascripts como templates

Para el que no esté familiarizado con django, explicaremos por encima su sistema de plantillas con el fin de que pueda entenderse el resto del post. De cualquier forma, recordamos que podéis acceder a una documentación bastante completa a través de este enlace: django-book.

Como algunos sabrán, django utiliza plantillas a las que posteriormente se les proporciona un contexto a través de diccionarios. Explicaremos esto con un breve ejemplo:

Plantilla «myname.html»:

Hola, me llamo {{ name }}.

Diccionario:

d = {'name':'Carlos'}

Renderizando:

render_to_response('myname.html',d)
Hola, me llamo Carlos.

Ahora, si recordamos, para pintar en un elemento canvas necesitábamos un javascript que lo asociara a una variable y nos permitiera indicar qué queremos hacer con éste. Vands es un juego basado en «sprites», por lo que la función de dibujo estrella será «drawImage». Teniendo esto, he aquí un ejemplo de cómo dibujar el cuerpo de un personaje en nuestro lienzo:

window.onload = function() {
   canvas = document.getElementById("canvas");
   contexto = canvas.getContext("2d");
   //Dibujamos el cuerpo del jugador
   contexto.drawImage(jugador.body_img, 
      jugador.x, jugador.y,
      jugador.body_width, jugador.body_height);
 }

De esta forma podemos dibujar la imagen «jugador.body_img» en las coordenadas («jugador.x», «jugador.y»)  y con unas dimensiones de «jugador.body_width» para la anchura, y «jugador.body_height» para la altura.

En Vands, el usuario pone cara a su personaje subiendo una foto. Ésta deberá ser ajustada para centrarla respecto al cuerpo. Este proceso implica que las coordenadas y las dimensiones de la cara sean diferentes para cada jugador.

Una base de datos se encarga de almacenar esta configuración para después ser recuperada por django:

Tabla «appearance»:

Donde:

  • «face_x» es la posición x relativa de la cara respecto al cuerpo.
  • «face_y» es la posición y relativa de la cara respecto al cuerpo.
  • «face_w» es la anchura de la cara.
  • «face_h» es la altura de la cara.

Para adaptar nuestro lienzo a las coordenadas del usuario activo, usaremos nuestro javascript a modo de plantilla para que, posteriormente, django pueda renderizarlo. Incluyendo en nuestro diccionario el objeto «appearance» obtenido de la tabla de arriba, obtenemos nuestro archivo .js final.

Plantilla «dibujarJugador.js»:

window.onload = function() {
   canvas = document.getElementById("canvas");
   contexto = canvas.getContext("2d");
   //Dibujamos la cara del jugador
   contexto.drawImage(jugador.face_img, 
      jugador.x+{{ appearance.face_x }}, jugador.y+{{ appearance.face_y }},
      {{ appearance.face_w }}, {{ appearance.face_h }});
   //Dibujamos el cuerpo del jugador
   contexto.drawImage(jugador.body_img, 
      jugador.x, jugador.y,
      jugador.body_width, jugador.body_height);
 }

Dibujamos primero la cara, pues el cuerpo se pintará encima a modo de máscara.

Renderizando:

//Obtenemos la apariencia del usuario que mantiene la sesión activa
appearance = Appearance.objects.get(user=request.session['user'])
render_to_response('dibujarJugador.js',appearance)

resultado:

window.onload = function() {
   canvas = document.getElementById("canvas");
   contexto = canvas.getContext("2d");
   //Dibujamos la cara del jugador
   contexto.drawImage(jugador.face_img, 
      jugador.x+2.5, jugador.y+1,
      30, 50);
   //Dibujamos el cuerpo del jugador
   contexto.drawImage(jugador.body_img, 
      jugador.x, jugador.y,
      jugador.body_width, jugador.body_height);
 }

Como adivinaréis, esto puede aplicarse a todo lo relacionado con la customización de la escena del juego. Por ejemplo, los instrumentos que posee el jugador o los miembros con los que forma alguna de sus bandas.

Publicado en Animación, Aspecto técnico, mvc | Etiquetado , , , , , | 2 comentarios

Primeras experiencias con html5

¿Qué nos ofrece?

La nueva versión de html incluye interesantes novedades en forma de etiquetas, APIs y javascript. Algunas de las utilidades de esta quinta versión del lenguaje básico de la World Wide Web son las siguientes:

  • Nueva etiqueta «canvas» para animación 2D y 3D. (Nosotros nos centraremos en esta parte).
  • Nuevas etiquetas para insertar audio y video en nuestra web de forma más cómoda.
  • Etiquetas que agilizan el uso de tablas dinámicas a través del manejo de estructuras de datos como Datagrid, Details, Menu y Command.
  • Nuevos tipos de datos para los formularios y posibilidad de validar contenido sin javascript.
  • Extiende la semántica de la web mediante nuevas etiquetas como  header, footer, article, nav, time o link rel.
  • API para hacer Drag & Drop.
  • Permitirá la descarga de contenido para navegación offline.
  • Geoposicionamiento.
  • WebStorage para gestión de bases de datos.
  • Comunicación bidireccional entre páginas mediante WebSockets.
  • Posibilidad de crear hebras mediante WebWorkers.

El elemento canvas.

Principalmente nos interesaba el tema de la animación 2D, así que buscamos en internet referencias al elemento canvas de html5. Dado que html5 se encuentra en fase experimental, no hemos encontrado ningún tipo de manual definitivo, por lo que tendremos que ser nosotros quienes os dejemos por escrito la idea básica de su funcionamiento.

Canvas funciona mediante javascript. En nuestro proyecto, cada vista se compone, al menos, de una pagina escrita en html con un elemento canvas. En cada página incluimos los archivos .js que permitan darle «vida» a nuestro lienzo. Construiremos un ejemplo que simplifique las cosas para hacerlas entendibles.

Primer paso: lo dicho, nos creamos una página en html e insertamos un elemento canvas, cuyos parámetros serán la anchura (width), la altura (height) y un id que utilizaremos para identificarlo desde nuestro js.

<!DOCTYPE html>
 <html>
 <head>
    <title>Mi primer canvas</title>
 </head>
 <body>
    <canvas id="canvas" width="500" height="300">
       <p>Su Navegador no soporta el elemento canvas de html5</p>
       <p>Use alguno de estos navegadores:<a
       href="http://www.opera.com">Opera</a>, <a
       href="http://www.mozilla.com">Firefox</a>, <a
       href="http://www.apple.com/safari">Safari</a>, and <a
       href="http://www.konqueror.org">Konqueror</a>.</p>
    </canvas>
 </body>
 </html>

Observamos que hemos incluido una serie de enlaces que aparecerán sólo si nuestro navegador no soporta html5.

Paso 2: Incluimos la siguiente linea en la cabecera:

<script type="text/javascript" src="dibujar.js"></script>

Esto nos permitirá identificar el arhivo «dibujar.js», que deberá encontrarse en el mismo directorio.

Paso 3: Empezamos a editar «dibujar.js». Lo primero que deberemos hacer es asociar nuestro canvas a una variable:

window.onload = function() {
    canvas = document.getElementById("canvas");
 }

Esta sentencia debemos introducirla en la función «onload» para asegurarnos de que la página se ha cargado por completo antes de buscar nuestro canvas.

Paso 4: Obtenemos un contexto del lienzo. Este puede ser 2D o 3D. Nosotros ni siquiera hemos intentado animar tridimensionalmente, por lo que seguiremos el ejemplo por el camino bidimensional:

window.onload = function() {
   canvas = document.getElementById("canvas");
   contexto = canvas.getContext("2d");
 }

Paso 5: Dibujamos una figura. Haremos algo sencillo: un rectángulo. Canvas incluye la típica función «drawRect», con la que animadores 2D en otros lenguajes estarán familiarizados. No obstante, lo haremos por el método rústico, a fin de entender como funciona el «libre trazo» en html5.

window.onload = function() {
   canvas = document.getElementById("canvas");
   contexto = canvas.getContext("2d");
   contexto.beginPath(); //Empezamos el dibujo
   contexto.moveTo(50,50); //Colocamos el lapiz en las coordenadas (50,50) del lienzo
   contexto.lineTo(100,50); //Trazamos una linea hasta las coordenadas (100,50) del lienzo
   contexto.lineTo(100,100); //Trazamos una linea más
   contexto.lineTo(50,100); //Trazamos otra linea
   contexto.lineTo(50,50); //Trazamos la linea que cierra nuestro rectángulo
   contexto.closePath(); //Finalizamos el dibujo
   contexto.stroke(); //Pintamos
 }

Leyendo los comentarios de cada instrucción podemos ver que la sintaxis para dibujar es bastante intuitiva.

Y hasta aquí este pequeño ejemplo. En Vands, la función de dibujo más utilizada es «drawImage», con la que podemos dibujar imágenes cargadas previamente en nuestro javascript. Existe la posibilidad de configurar parámetros como la transparencia (componente alpha), la anchura de linea o la fuente y tamaño del texto (también se incluyen métodos que dibujan texto). Aquí tenéis una lista completa de las funciones que canvas ofrece: http://www.w3schools.com/html5/html5_ref_canvas.asp .

Enlaces de muestra

A fin de motivar a la gente a que prueben a darle forma a sus ideas con html5, aquí os dejamos algunos enlaces que creemos reflejan las capacidades del lenguaje.

 

Algunos problemas

El mayor problema que nos encontramos al animar a través de html5, fue el de la tremenda ineficiencia que éste presenta. Acostumbrados a flash, a algunos les puede resultar molesto dibujar más de dos imágenes y que pete su explorador. En este sentido, html5 es bastante limitado. A día de hoy, no hemos encontrado una solución y muchos pcs no cargan la aplicación al ritmo que debieran. No obstante, se estuvo trabajando en una tipo de rejilla que alivia parte del problema. Hablaremos de cómo repintar sólo lo necesario cuando posteemos sobre la librería «vands_lib.js». Existen aplicaciones en internet (como las que hemos dejado más arriba) que, aparentemente, son bastante más complejas que Vands pero cuyo rendimiento funciona a la perfección, cosa que todavía estamos intentando explicarnos. Intuimos que html5 ofrece alguna manera de gestionar todo esto automáticamente pero, dada la insuficiencia de información en internet respecto al tema, aún estamos intentando averiguarla.

Esto nos lleva al siguiente inconveniente: toda la documentación que encontramos ha sido a través de experiencias personales como esta. Fue mucho más fácil obtener resultados de forma rápida con django a través de su libro. Aprender a construir en html5 a base de retazos que vas encontrando por ahí hace que el proceso sea más lento y que, a la hora de abordar una determinada tarea del proyecto, no siempre se empiece escogiendo la mejor alternativa.

Aúnque html5 todavía está muy lejos de desbancar a flash, animamos a los amantes de la animación 2D a probar sus posibilidades. Para finalizar, como supongo que querréis conocer los pros y los contras de estos dos lenguajes a la hora de desarrollar videojuegos, aquí os dejamos una comparativa bastante gráfica.

Publicado en Animación, Aspecto técnico | Etiquetado , , , , , | Deja un comentario

Sobre el concurso

Para el que no esté al tanto, y antes de seguir detallando el desarrollo del proyecto, quería dedicar un breve post para hablar del Concurso Universitario de Software Libre (CUSL) para el que este blog fue creado principalmente.

Licencia del proyecto 

Este proyecto utiliza la licencia «Gnu Affero General Public License», lo que significa que el software que se está desarrollando intenta secundar el conocimiento libre haciendo libre su distribución.  Para más detalle sobre cómo liberar vuestro software podéis echar un vistazo a este enlace.

Concurso

Al tratarse de software libre, tuvimos la oportunidad de participar en el CUSL en su sexta edición. En su página (https://www.concursosoftwarelibre.org/1112/portada) podéis acceder a la lista de proyectos inscritos. Éstos se mantienen alojados en la forja RedIris, forja oficial del concurso en la que podemos acceder al código de cada proyecto y seguir así su desarrollo. Puedes examinar el código de Vands a través de su dirección en RedIris: https://forja.rediris.es/projects/cusl5-vands/ .

El concurso es a nivel nacional y a día de hoy puede encontrarse una lista de 99 proyectos (de los cuales 18 son granadinos) pertenecientes a 139 estudiantes, todos con su correspondiente espacio en la forja, twitter para manterse al día de su progreso y un blog que nos acercará más a la experiencia de cada proyecto individualmente (tal y como intentamos hacer nosotros con este). El objetivo de un concurso de este tipo no es simplemente competir. En mi opinión, cada concursante adquiere su premio en cuanto empieza a formar parte de esta comunidad. No se me ocurre mejor forma de enriquecerse que teniendo la oportunidad de conocer tantas otras ideas y de considerar otras metodologías o puntos de vista de personas que, a la vez, se enriquecen con tu trabajo.

Hackathon

Terminaré mencionando las jornadas que se celebrarán en breve para la gente inscrita en el CUSL y perteneciente a la UGR. Se trata de la tercera edición del Hackathon. En su
página podéis ver los detalles y conocer el nombre de los siete proyectos que se darán a conocer en la ETSIIT (el equipo de Vands asistirá, aunque no en calidad de participante). No hace falta pilotar en el tema para acercarse a echar un vistazo. Si no eres programador, también estás invitado a asistir, pues seguro que pescas algo interesante. Si es así, alli nos veremos!

Publicado en General | Etiquetado , , , , , , , | Deja un comentario

Los comienzos

Existen dos grandes categorías a las que referirnos al hablar de este proyecto: el Modelo Vista Controlador y la interfaz gráfica que se ayuda de este. En esta entrada hablaremos del por qué de las elecciones tomadas y del por qué de las rechazadas. No olvidéis que uno de los motivos por los que abordé este proyecto fue por la escasa instrucción que encontré en el programa de la ETSIIT sobre programación web, tema en el que estoy bastante verde. Con esto quiero decir que, aunque he pasado bastante tiempo documentándome, es posible que en esta entrada o en posteriores escriba alguna incoherencia.

Interfaz gráfica

¿Cuál era el propósito?

Cuidar en todo momento la estética de la aplicación para hacerla lo más llamativa posible. En realidad, que una aplicación llegue a motivar al usuario depende de su funcionalidad. Pero una puesta en escena de los acontecimientos lo suficientemente cómica también ayuda.

¿Qué encontré?

Desde el principio el debate estuvo entre «flash» o «html5». Con el primero tenía acumulada cierta experiencia. Además el framework para flash «CS4» era mucho más cómodo que programar «a pelo» con html5. Adobe decidió apostar también por este último con el framework correspondiente «edge», que todavía se encontraba (y se encuentra) en su versión beta y que finalmente rechacé utilizar.

¿Qué decidí?

Las razones por las que finalmente escogí html5 fueron dos: el hecho de que html5 no necesite plugins adicionales como flash (sólo necesita tener una versión de explorador que lo soporte) y porque consideré que era un buen momento para aprender el funcionamiento de este lenguaje que, bajo mi punto de vista, empieza prometiendo bastante. Es un hecho que muchas empresas, como Apple o CBS, muestran mayor disposición a integrar html5 en sus productos en lugar del inestable «ActionScript» de flash.

Librerías

Estuve indagando en busca de librerías por aquello de no reinventar la rueda. Encontré algunas realmente interesantes. Aquí dejo los links de las librerías con las que intenté ayudarme:

Paper.js:     http://paperjs.org/

Gury.js:      http://guryjs.org/

Aún así, Vands funciona prácticamente en su totalidad con sprites. Lo que me interesaba era encontrar alguna librería que se centrase en este aspecto. Las vistas de la aplicación no tienen nada de complicado pues la mayoría se tratan de un personaje recorriendo una estancia o de un menú interactivo. Es por eso que decidí crear mi propia librería «vands_lib.js», a la que dedicaré un post más adelante. De todas formas, si alguien está interesado en hacer algo más complejo (como un juego de plataformas), existen librerías que al menos te restan trabajo a la hora de montar sprites y darles alguna animación. La librería «easel.js» es una buena opción: http://easeljs.com/ .

Modelo Vista Controlador

 

¿Cuál era el propósito?

Pretendía crear una web que soportase cuentas de usuario. Además, cada vista de la página  constaría prácticamente de un elemento canvas de html5 y seis ficheros javascipt para hacerlo interactivo.

¿Qué encontré?

Como primerizo en frameworks para MVC, mis principales opciones fueron «Ruby On Rails» y «DJango».

¿Qué decidí?

Tras leer los debates que se forman en internet acerca de cuál de los dos es superior al otro, llegué a la conclusión de que RoR es el más popular, y que supera en muchos aspectos a django. Pero mucha gente me había hablado ya de experiencias de primera mano con django y la verdad es que mi aplicación necesitaba la flexibilidad que este me ofrecía. El hecho de usar «templates» que permitan renderizar mis javascript con los parámetros personales de cada usuario me resultaba bastante cómodo, así que con django me quedé.

Aquí os dejo el libro de django traducido al español que, bajo mi punto de vista, es una documentación bastante completa: django-book .

Actualmente estoy metiendo algo de php para el tema de subir imágenes al servidor por parte del usuario mediante ftp. Seguiré escribiendo más sobre el tema cuando tenga algo medio hecho.

Publicado en Aspecto técnico | Etiquetado , , , , , | 2 comentarios

Vands!

Imagen

¿Qué es Vands?

Es una aplicación online en la que adoptarás el rol de músico. El objetivo del juego consiste en montar «vandas» con otros usuarios de la red para alcanzar la fama. Esto se conseguirá a través del mérito propio y del de tu banda.

¿Cómo se juega?

La idea general, como en todo juego de rol, es mejorar la calidad de tu músico y sus bandas. Deberás darte a conocer y ofrecer conciertos para obtener recursos necesarios para seguir progresando. Tendrás la oportunidad de comprar/vender instrumentos musicales e incluso de coleccionar discos. En fin, el mecanismo completo se irá detallando durante el desarrollo de la aplicación en este mismo blog.

¿En qué lenguajes/librerías se apoya el proyecto?

Se trata de un MVC modelado con django de python. La verdad es que no hemos considerado ninguna otra opción por ser novatos en el tema. Aún así django funciona a la perfección!

En cuanto a la animación, consideramos en un primer momento utilizar flash. Dado que ActionScript presenta muchos agujeros en su lenguaje, finalmente optamos por html5 (junto con javascript) que, aunque aún está empezando a nacer, presenta muy buenos resultados.

¿Quienes somos?

Mi nombre es Carlos Moreno, estudiante de informática en la ETSIIT y me encargo de montar todo el esqueleto de la aplicación y de animar con html5. El que lleva la parte estética es Alvaro Garrido, estudiante de bellas artes. Él se encarga de diseñar absolutamente todo, hasta el último botón.

¿Qué encontraremos en este blog?

Entraremos en detalle con todo lo publicado en nuestro identi.ca @vandsproject .

La verdad es que el proyecto comenzó allá por octubre cuando empezamos a tener las primeras ideas. Por ello, en los próximos días las entradas constituirán la memoria del trabajo realizado hasta el día de hoy.

¿Podremos participar de alguna forma?

Debéis participar! Consideramos que dos cabezas piensan mas que una, por lo que cuantas más cabezas mejor. Si tenéis cualquier sugerencia después de leer la forma en que abordamos los problemas, encontremos o no solución, no dudéis en sugerir, comentar o criticar. De la misma forma y dejando de lado el aspecto técnico, el gran favor que podéis hacernos es presentar ideas sobre el funcionamiento del juego. Ejemplo: «a mi me gustaría personalizar mi batería poniendo mi cara en el bombo!». Queremos hacer algo verdaderamente entretenido y cualquier aporte se agradecerá ampliamente.

Sin entreteneros más: Bienvenidos a Vands!

Publicado en General | Etiquetado , , , , , , , , | 3 comentarios