Google o la constante frustración

Noviembre 28, 2008

Pues resulta que comenté el otro día que me había puesto a mover las cosas a google sites para que se pudieran descargar los ficheros que no podía almacenar en wordpress.com de forma directa. Pero oh casualidades del destino, que el otro día cuando puse el enlace a la canción del korobeiniki, resulta que ya no se pueden bajar las cosas directamente desde páginas externas a google. Así que al final no me he salido con la mía y de nuevo me siento decepcionado con google y sus pequeñas barreras a modo de obstáculo. Para ser una empresa tan cool google, resultan ser bastante decepcionantes haciendo aplicaciones web, más allá de su mítico buscador.

Pero no todo son malas noticias desde google como usuario, ahora parece ser que por fin les ha dado por intentar mejorar youtube y creo que ahora se pueden subir videos en formato 16:9, y tan ta ta chan… Se pueden subir videos con mayor resolución que 320×240, de hecho en algunos videos ya sale la opción de “Ver en alta calidad” o algo así. Es bueno saber esto, que si uno necesita subir videos de sus proyectos con un mínimo de calidad, que “San” Google por fin ha dado un palo al agua para variar y ha mejorado youtube. Por cierto, también han hecho otra “mejora”… han puesto un nuevo sistema de publicidad invasiva, que surge en la zona baja del video, pudiendo resulta un tanto molesta si el video no se ve a pantalla completa. Supongo que no les bastaba con poner un baner cuadrado en la derecha de la página, que suele ser cantoso a más no poder. Así que una de cal y otra de arena.

Un saludo,
Gorka Suárez.


Korobeiniki, intento número 1

Noviembre 26, 2008

Como sabreis, me encuentro haciendo un clon del tetris bajo java y todos hemos jugado a la versión de la gameboy, por lo que pensé que sería genial poder tener una musiquilla lo más parecida posible. Así que me puse a buscar alguna versión bajo la creative commons de la canción tradicional en la que está inspirada la canción del tetris de la gameboy. Pero tras muchos intentos, lo único que he encontrado son una partituras no del todo exactas y un buen palmo de narices.

Así que lejos de rendirme, me bajé el OpenMTP (antiguo Modplug Tracker) y valientemente me puse a transcribir la canción más o menos, intentando encontrar un parecido razonable. Y después de muchos trapicheos y copiar patrones de ondas cuadradas, logré hacer algo moderadamente similar. Por suerte Sync me ayudó afinando un poco las muestras de sonido. Y el resultado está aquí en formato ogg. Ciertamente no es todo lo buena que yo quería, pero después de 2 o 3 días para conseguir una puta canción, para hacer un miserable clon del tetris, creo que me doy por satisfecho. Además hay que añadir, que no soy demasiado bueno para la música, así que es todo un logro esta canción.

También estoy pensando en poner otras canciones menos cargantes, como opción, porque la canción al final puede rayar un cojón todo el rato igual. Así que estoy viendo que voy a tener una lista de créditos bastante larga, por todos los recursos sonoros o gráficos que estoy empleando para el tetris.

Un saludo,
Gorka Suárez.


Probando Google Sites

Noviembre 20, 2008

Que no cunda el pánico, que no me estoy cambiando de web otra vez, jej. Como wordpress.com no me deja almacenar ficheros zip, ni de muchas otras clases, tuve que recurrir al servicio de Microsoft de SkyDrive para almacenar muchas de las cosas de mi web. El único problema es que no descarga directamente, pero acabo hoy de solventar esa situación subiendo todo también a una web creada con Google Sites.

Lo cierto es que está bastante mejor que el servicio de Google Pages, aunque sigue siendo bastante ortopédico para muchas cosas. Lo buena noticia de todo esto es que creo que podré usarlo para colgar la versión applet del tetris que estoy haciendo, ya que aquí no me iba a dejar seguramente al no poder subir ficheros JAR ni class. Respecto al Tetris, el fin de semana pasado estuve haciendo la clase Font para escribir texto con las letras almacenadas en una imagen. El porqué lo estoy haciendo así en vez de usar el Font que viene con el AWT es más por evitarme la posibilidad de que fuera a elegir una fuente que no exista en el cliente, además con J2ME ya probé con el Pong a escribir texto con la API propia de java y fue toda una “agradable” sorpresa ver como cambiaba completamente lo que veía yo en mi móvil, a como lo veía en el emulador.

Un saludo,
Gorka Suárez.


Los applets y las cookies

Noviembre 13, 2008

Bueno, como sabeis estoy tratando de hacer el juego del Tetris para java, con una versión de applet y otra de móvil. Y como es lógico para este juego en particular, lo suyo sería que el jugador tuviera sus puntuaciones máximas guardadas, para poder ver sus “logros”. El almacenamiento en J2ME se resuelve con el RMS (Record Management System), pero con los applets no hay nada de eso a simple vista. Un applet tiene capado el acceso al disco duro por motivos obvios de seguridad.

Así que estaba planteándome el no poner lo del registro de la puntuación en la versión del applet, hasta que se me ocurrió pensar que lo mismo podía utilizar las cookies para guardar los datos de las puntuaciones. Las cookies tienen sus limitaciones y problemas, pero es mejor eso que nada y como desarrollador de videojuegos nos da la opción de ofrecer juegos en applets con la posibilidad de guardar el avance del jugador. Por ejemplo, se podría hacer un juego rpg en un applet, que guardara la partida y todo.

Tras rastrear con google durante varios días, como acceder a las cookies desde un applet, tuve la mala fortuna de no encontrar gran cosa al principio. Una de ellas planteaba usar streams para guardar datos en un fichero temporal de sesión… el problema es exactamente eso, que no deja de ser algo temporal que al cerrar el navegador o el applet se eliminaba. Pero ayer encontré algo llamado JSObject, que resultó ser una API creada por netscape para que desde Java se pudiera acceder a JavaScript en una página web. Eso permite entre otras cosas aprovechar JavaScript para leer y escribir las cookies de la página. Pero para ello hay que invocar al applet del siguiente modo:

<applet code="MiJuego" width=640 height=480 mayscript>
</applet>

Se añade el parámetro mayscript, para indicar al navegador y a la máquina virtual de java, que va a existir una conexión entre JavaScript y nuestro applet. Luego ya en el código tenemos que importar las siguientes librerías, que podemos encontrar en el interior de “/lib/plugin.jar” dentro del JRE que tengamos instalado:

import netscape.javascript.JSObject;
import netscape.javascript.JSException;

Si estais usando Eclipse, en las propiedades del proyecto dentro de “Java Build Path” está la pestaña de “Libraries”, donde podemos añadir (“Add JARs…”) la librería plugin.jar para que cuando se compile el proyecto, el compilador sepa donde está. Teniendo esto, lo siguiente es saber como podemos guardar o leer las cookies y tras mirar diversos tutoriales por internet sobre como usar el JSObject o como se acceden a las cookies con JavaScript, me he creado unas funciones en java para ello:

public void createCookie (String name, String value, long days) {
    try {
        JSObject win = JSObject.getWindow(this);
        long time = days * 24 * 60 * 60 * 1000;
        String cmd = "var date = new Date();" + "date.setTime(date.getTime() + " +
                     String.valueOf(time) + ");" + "date.toGMTString();";
        String expires = "; expires=" + (String) win.eval(cmd);
        value = (String) win.eval("escape('" + value + "');");
        win.eval("document.cookie = '" + name + "=" + value + expires + "; path=/';");
    } catch (JSException ex) {
        System.out.println(ex.getMessage());
    }
}

public String readCookie (String name) {
    try {
        JSObject win = JSObject.getWindow(this);
        StringTokenizer st = new StringTokenizer((String) win.eval("document.cookie"), ";", false);
        String line, value;
        int eqpos;
        while(st.hasMoreTokens()) {
            line = st.nextToken().trim();
            eqpos = line.indexOf('=');
            if(line.substring(0, eqpos).compareTo(name) == 0) {
                value = line.substring(eqpos+1, line.length());
                value = (String) win.eval("unescape('" + value + "');");
                System.out.println(value);
            }
        }
    } catch (JSException ex) {
        System.out.println(ex.getMessage());
    }
    return null;
}

public void eraseCookie (String name) {
    createCookie(name, "", -1);
}

Con estas funciones si queremos guardar una cookie, solo tenemos que llamar a createCookie y pasarle el nombre, los datos y el número de días que le quedan para expirar. La función readCookie pasándole el nombre, nos devuelve en una cadena los datos que le hemos pasado antes. Y la función eraseCookie borra la cookie asociada al nombre que le pasemos.

Y con esto ya podemos guardar datos de las partidas en nuestros juegos, aunque el método es algo tosco y con las limitaciones que las cookies conllevan. Por no hablar del problema que supone que un usuario borre las cookies, con lo que borraría las partidas y las puntuaciones almacenadas. Pero bueno, mejor esto que nada.