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.