Como guardar datos con ficheros de texto
Hemos hablado de la gestión de ficheros de texto en Game Maker Studio, y también sabemos cómo gestionar ficheros ini. Ahora vamos a hablar de almacenar datos en ficheros de texto estándar.
Diferencia con los ficheros ini
Comentamos que los ficheros ini tiene una estructura fija de Sección→Clave→valor a la hora de almacenar los datos, de manera que no podemos almacenar grandes cantidades para poder gestionar correctamente los datos.
Si queremos almacenar grandes cantidades, podemos grabarlos directamente en el archivo como queramos. Por ejemplo:
obj_player lives 3 music true sprite_index 00001000054 0000100087
De esta manera podemos grabar centenares de líneas.
Además, Game Maker Studio solo permite gestionar un fichero único a la vez, pero con ficheros de texto puedes tener hasta 32 ficheros abiertos a la vez.
Cómo se gestionan los ficheros de texto
Entonces, si no existen las secciones y las claves, ¿cómo se lee y se escribe en un fichero de texto estándar? Los ficheros se gestionan línea a línea, así que debemos saber que datos hay en cada línea para poder leerlos, y tener cuidado a la hora de guardar para tener un cierto orden lógico en cada cambio de línea.
Igualmente que sucede con los ficheros ini, hay que abrir y cerrar el fichero. Como podemos tener varios ficheros abiertos, debemos almacenar en una variable una referencia para saber que fichero estamos tratando (aunque sea solo uno).
También hay que decidir si, cuando queremos grabar datos, borramos los posibles datos que ya tenemos guardados o los añadimos al final. Todo esto se puede controlar con las funciones de sistema.
Funciones de ficheros de texto
Vamos a repasar las distintas funciones para manejar este tipo de archivos planos. Para empezar, existen cuatro maneras de abrir un fichero:
file_text_open_read(ruta_archivo)
: abrimos el fichero solo para poder leerlo.file_text_open_write(ruta_archivo)
: abrimos el fichero sólo para escribir en él.file_text_open_append(ruta_archivo)
: abrimos el fichero para añadir en él, al final del posible contenido.file_text_open_from string(cadena)
: creamos un fichero temporal para leer en él, que se eliminará cuando lo cerremos. El contenido del archivo se le pasa por parámetro.
Es importante saber que estas funciones retornan el identificador necesario para operar con estos ficheros, ya que podemos abrir hasta 32 ficheros diferentes, y cada uno de ellos deberían de estar guardados en variables que podamos acceder dentro del objeto o de los scripts. Esta variable es la que se le pasa por parámetro a las funciones que operan con los datos.
Para leer los datos, recordad que podemos leer texto o números, tenemos dos funciones separadas para hacerlo: file_text_read_real()
y file_text_read_string()
.
Como los ficheros de texto se lee línea a línea, significa que podemos tener más de un dato en una línia. Por ejemplo, podemos leer un número, un texto y otro número todo en la misma línea (podría ser las variables de un objeto en concreto). ¿Cómo saltamos de línea? Con la función file_text_readln()
. Como añadido, esta función devuelve la línea entera por si la queremos tratar de una vez.
Para escribir tenemos las mismas funciones equivalentes que para leer: podemos escribir un número, un texto o un salto de línia. Para ello, tenemos las funciones file_text_write_real()
, file_text_write_string()
y file_text_writeln()
.
También tenemos un par de funciones específicas que no teníamos con los ficheros inis, y nos sirven para comprobar ciertas cosas. Por ejemplo, si queremos saber si estamos al final de una línea que estamos leyendo file_text_eoln()
, o si estamos al final de la lectura del fichero entero, file_text_eof()
. ¿Porqué tenemos estas funciones? Porque el tamaño de la línea y el fichero es dinámico, es decir, puede variar. Por ejemplo, si grabamos las variables de un objeto principal o del personaje (x, y, sprite_index, vida, arma, etc.) es muy posible que lo tengamos controlado y siempre se grabe el mismo número de variables. Pero imaginemos que queremos grabar la posición de todos los enemigos que tenemos en pantalla. Podemos tener 5 o 30. A la hora de leerlo, necesitamos saber cuando hemos llegado al final para saber que no hay más enemigos. Un ejemplo de código sería así:
file = file_text_open_read(working_directory + "\Game_Data.txt"); while (!file_text_eof(file)) { xx = file_text_read_real(file); yy = file_text_read_real(file); file_text_readln(file); } file_text_close(file);
Finalmente, para cerrar el fichero, ya sea de lectura o escritura, tenemos file_text_close()
.
Conclusión
Ya no tenemos excusas para no saber nuestras partidas en el ordenador, tablet o móvil. ahora podemos gestionar dos tipos diferentes de ficheros para salvar datos a archivos.
¿Alguna duda? ¿Creéis necesario algún ejemplo?
podrian poner un ejemplo, es que no me quedo muy claro como usarlos
Hola, en el post dónde hablo de gestionar idiomas tienes un ejemplo con ficheros ini. Con ficheros de texto haré un ejemplo en breve.
Muy bien toda esta información y mil gracias colega. Esto hará que nuestros juegos sean muy profesionales.
Gracias.
Saludos.
hola David.
primero gracias por tus ayudas. son geniales.
Mi pregunta era referente con html5. Una vez grabas el archivo en el local_storage con file_text_write_string, hay manera de, por ejemplo, desde windows, que el usuario lo pueda ver? yo necesito dejarle un texto para que él lo pueda copiar y pegar en su block de notas o word. como puedo intercambiar datos desde html5 con el usuario? mil gracias
Yo he probado de grabar ficheros ini en un proyecto html5 y funciona perfectamente.Pero tienes que ver dónde guarda el fichero, también depende del sistema operativo.