Bienvenidos sean a este post, hoy veremos como guardar y recuperar el puntaje mas alto de nuestro juego.
Como buen juego que maneja puntajes se necesita guardar cual fue el mejor puntaje durante nuestras practicas y si bien hoy lo podriamos hacer este se perderia cuando reiniciemos el juego, para evitar esto vamos a utilizar un archivo para almacenar el valor mas alto y cuando hagamos un puntaje mas alto al almacenado lo reemplazaremos y tambien haremos la opcion para recuperar dicha informacion y poder saber cuando lo superamos.
Si bien GameMaker soporta varios formatos para manejar archivos, uno es de tipo texto y el otro binario como casi cualquier lenguaje de programacion, nos decantaremos por el metodo mas facil que es atraves de un archivo ini, este es el metodo mas simple para comenzar pero cuando se sientan con mas confianza pueden probar con los otros formatos, pero que es un archivo INI? Basicamente hablando es un archivo que usualmente se usa para configuracion, establecer valores que se necesiten durante todo el programa y puedan ser facilmente editadas, su estructura mas basica se basa en secciones y valores, esto nos permite tener una mejor estructura interna de nuestro archivo, los comentarios en general se hacen con el punto y coma (;) en lugar de la forma tradicional, algunos soportan tener lineas en blanco o espacios en blanco y otros no, en general las lineas en blanco no tiene tanta incompatibilidad pero en el caso de los espacios en blanco traten de evitarlos.
Con esto brevemente explicado vamos a crear un nuevo archivo en blanco de tipo texto, pueden hacer click con el boton derecho en la carpeta datafiles de nuestro proyecto y seleccionen Nuevo -> Documento de texto, con este archivo creado renombrenlo a score.ini, una vez creado lo abriremos con el notepad, o el editor de textos mas basico que utilicen, no deben usar Word o cualquier editor de texto mas complejo, una vez abierto comenzaremos con la creacion del formato del archivo, en general siempre trabajan de la siguiente forma:
; Comentario para explicar sobre la seccion.
[ nombre seccion ]
identificador = valor
La primer linea es un ejemplo de comentario donde podemos comentar de que se trata la seccion, si necesitan mas de una linea recuerden poner siempre el punto y coma (;), luego tenemos la seccion, este es un valor unico y siempre va entre corchetes ([ ]), luego ira el identificador seguido de un igual y el valor que contendra, si lo tenemos que comparar trabaja de la misma forma que las variables, todos los identificadores que esten debajo de la seccion perteneceran a esta, para cambiar de seccion simplemente agregan otro identificador de seccion, les paso un ejemplo:
; Seccion para la ventana
[Ventana]
x = 100
y = 100
ancho = 360
alto = 120
; Seccion para el jugador
[jugador]
vidas = 3
salud = 100
alto = 32
ancho = 16
Este es solo un ejemplo de como podemos utilizarlo para un juego, donde setearemos la ventana del juego y algunos de los datos del jugador, como pueden ver es bastante simple y universal, volviendo a nuestro proyecto iremos al archivo que generamos dentro de la carpeta del proyecto y le agregaremos el siguiente codigo:
[puntajealto]
puntajealto = 0
Como pueden ver es muy simple, para este caso iniciaremos con el valor de 0, debe comenzar con algun valor, al cual luego modificaremos pero eso lo veremos un poco mas adelante, una vez hecho esto debemos ir al GameMaker Studio, vamos al Asset Browser y clickearemos en el boton resaltado

Nos abrira el menu que se ve en la imagen y ahi debemos seleccionar Included Files, una vez abierto nos debera aparecer de la siguiente forma

Con esto tenemos nuestro archivo incluido, vamos a ver todo el proceso mediante el siguiente video
Nuestro siguiente paso sera ir al room de raiz o rm_setup y agregaremos mas codigo en Creation Code, recuerden que es un boton en las propiedades del room que aparece en el panel de la izquierda, y una vez que tenemos nuestra ventana para agregar codigo le adicionaremos el siguiente bloque:
ini_open("score.ini");
global.puntaje_alto = ini_read_real(
"puntajealto",
"puntajealto",
0);
ini_close();
Lo primero que sera es abrir por medio de ini_open al archivo que generamos, luego crearemos una variable global a la cual llamaremos puntaje_alto y por medio de ini_read_real obtendremos los datos, su sintaxis es facil:
- El primer argumento es la seccion del archivo
- El segundo argumento es el valor que queremos recuperar
- El tercero es un valor predeterminado por si el anterior no se puede obtener
Nota: En este caso usamos a ini_read_real para obtener un numero pero tambien existe ini_read_string que es para recuperar texto y es exactamente igual.
Por ultimo cerramos el archivo, esto debe hacerse siempre porque GameMaker Studio no permite trabajar con mas de un archivo INI, con esto ya obtuvimos el valor almacenado en score.ini y lo asignamos a una variable global la cual tendremos acceso en todo nuestro programa, nuestro siguiente paso sera agregar la capacidad de modificar el valor de nuestro «record» o «puntaje alto», para ello debemos ir al objeto obj_Pepe en el evento Step y buscaremos el condicional donde verificamos que el jugador esta mas alla del alto de la pantalla:
if (y > room_height)
Dentro de este condicional debemos agregar el siguiente bloque pero antes del condicional que hace el reseteo del room:
if (global.puntaje_alto < score)
global.puntaje_alto = score;
En este lo unico que hacemos es verificar si nuestro puntaje mas alto quedo por debajo del puntaje del jugador y en caso de ser verdadero procedemos a actualizarlo con este nuevo valor, tan simple como beber agua, veamos como quedo el condicional de la «muerte»:
if (y > room_height)
{
if (!hacer_caja_texto)
{
global.msj = "Haz muerto, y el juego se reiniciara.";
instance_create_depth(
156,
320,
0,obj_CajaTexto);
hacer_caja_texto = true;
}
if (global.puntaje_alto < score)
global.puntaje_alto = score;
if (global.caja_texto_finalizado)
room_restart();
}
Solo nos faltan un par de modificaciones mas antes de finalizar, la proxima sera para guardar el cambio anterior y para ello debemos ir a nuestro objeto de pausa, obj_Pausa, una vez en este iremos a nuestro evento Draw donde buscaremos el condicional que verifica por la tecla presionada igual a Enter:
if (keyboard_check(vk_enter))
Dentro de este condicional iremos al switch donde verificamos a eleccion y al case 1 lo modificaremos de la siguiente manera:
case 1:
ini_open("score.ini");
ini_write_real("puntajealto",
"puntajealto",
global.puntaje_alto);
ini_close();
global.room_destino = rm_setup;
instance_create_depth(
0,0,0,
obj_Transicion);
break;
En este caso agregamos unas opciones para cuando debemos salir y volver al menu principal, es muy similar a cuando vimos para recuperar la informacion del archivo, es decir primero abrimos el archivo con ini_open, luego en lugar de usar ini_read_real usaremos a ini_write_real y no lo asignaremos a ninguna variable, esta funcion se dedicara a escribir en nuestro archivo el valor que tenemos en la variable global puntaje_alto, su sintaxis es la misma que la de lectura: Primero ira la seccion, luego el campo o variable a modificar pero el ultimo parametro sera el valor a almacenar, en lugar del predeterminado, y por ulitmo lo cerramos, el resto de codigo que tenemos es el que habia antes para hacer la transicion al menu de inicio, veamos como quedo este condicional:
if (keyboard_check(vk_enter))
{
switch(eleccion)
{
case 0:
instance_destroy();
break;
case 1:
ini_open("score.ini");
ini_write_real("puntajealto",
"puntajealto",
global.puntaje_alto);
ini_close();
global.room_destino = rm_setup;
instance_create_depth(
0,0,0,
obj_Transicion);
break;
}
}
Nuestro ultimo paso sera mostrar el puntaje mas alto en pantalla, para ello debemos ir al objeto de puntaje, obj_Puntaje, y en el evento Draw modificaremos su condicional:
if (room == rm_main)
{
draw_set_alpha(1);
draw_set_color(c_white);
draw_set_font(fnt_Menu);
draw_text(10,10,"Puntaje:");
draw_set_font(fuente_puntaje);
draw_text(80,10,score);
}
De la siguiente manera:
if (room == rm_main)
{
draw_set_alpha(1);
draw_set_color(c_white);
draw_set_font(fnt_Menu);
draw_text(10,10,"Puntaje:");
draw_text(200,10,"Record:");
draw_set_font(fuente_puntaje);
draw_text(80,10,score);
draw_text(270,10,global.puntaje_alto);
}
Si observan solo agregamos dos lineas, una para la etiqueta (Record) y otra para mostrar el valor actual de global.puntaje_alto, sino les queda como ustedes quieren pueden modificar los valores de ubicacion, solo nos resta una modificacion mas para poder finalizar con este tema y esta es mostrar el record al inicio de nuestro juego o lo mismo que decir en nuestra pantalla de inicio, para esto la haremos de una manera simple, vamos al objeto de inicio, obj_Inicio, de ahi pasaremos a su evento Draw y al comienzo del mismo, mas exactamente despues de que escribimos el titulo y antes de los condicionales para los botones agregaremos las siguientes lineas:
draw_text(200,10,"Record: ");
draw_text(270,10,global.puntaje_alto);
En este caso le haremos escribir la etiqueta y el valor que tiene global.puntaje_alto, recuerden que al volver a este room lo volvemos a leer desde el archivo INI, le di la misma ubicacion que en el anterior caso pero con una diferencia, esta vez no usare la fuente que creamos para mostrar el valor sino que usaremos la fuente para mostrar el texto de este room, con este simple modificacion nos quedara de la siguiente forma

Con todo esto podemos probarlo y ver si realmente nos guarda el valor cuando se modifica, compilemos y veamos que sucede mediante el siguiente video
Con esto tenemos nuestro juego completo y si vuelven a abrir el juego siempre nos volvera a traer el valor almcacenado en score.ini, con todo esto vamos a abrir nuestro archivo .ini en la carpeta datafiles para ver como se modifico.
Si lo abrieron y notaron que no se modifico, felicitaciones!! Eso significa que nuestro programa funciona perfecto pero si no lo almacena aca donde lo almacena? La respuesta es sencilla, lo hace en el appdata local del usuario o lo mismo que decir:
%localappdata%\<nombre juego>
Les dejo un ejemplo de la ubicacion de mi archivo:
C:\Users\tinchicus\AppData\Local\SaltaPepe
Si observan dentro de la carpeta con el mismo nombre del juego tendran el archivo INI, y si lo abren tendran esta informacion:
[puntajealto]
puntajealto="295.000000"
Como pueden ver en este archivo si tenemos la informacion correcta, esto es debido a que GameMaker Studio no trabaja sobre el archivo directamente sino que hace una copia del original al recurso antes mencionado y trabaja sobre este, por lo tanto si desean resetear el archivo o eliminarlo por fuera de las funciones que maneja los archivos INI deben ir a la localizacion antes mencionada.
En resumen, hoy hemos visto como crear una forma sencilla de manejar datos generados en nuestro juego, ya sea guardando o cargando los mismos, hemos visto una breve explicacion de los archivos INI, tambien hemos visto primero como recuperarlos y usarlos a traves de todo el juego, despues hemos visto como guardarlos, para despues explicar como mostrarlos en pantalla y por ultimo hemos hablado como trabaja GameMaker Studio con respecto a los archivos, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.00
