Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: LowHertzs en Agosto 01, 2014, 09:36:45 PM

Título: Guardar y cargar partida .INI
Publicado por: LowHertzs en Agosto 01, 2014, 09:36:45 PM
Hola makeros! vengo con algo que puede parecer muy básico pero a mi me está volviendo loco. Antes de que me digáis que mire la guía os aseguro que la tengo más que vista, pero no capto algunas cosas.

Lo que busco es muy simple, un sistema de cargar y guardar partida automáticamente en .ini, lo que quiero es que guarde la room ultima en la que llegó a estar el personaje, que tambien guarde ciertas variables, es decir si consigo una llave en una room que en otra se desbloquee la puerta, la vida, y la posición del jugador. Tan solo quiero que guarde eso.

Voy a intentar poneros (con la guia de gm:s en la mano lo que yo pondría, pero me faltan muchas cosas que no consigo entender, a ver si me podéis orientar).

Para que guarde la partida:
ini_open("mazmorra.ini");
ini_write_real("mazmorra","room",room);
ini_write_real("mazmorra","vida",vida);
ini_write_real("mazmorra","player_position",player_position);
ini_write_real("mazmorra","door1",closed);
ini_write_real("mazmorra","door2",closed);
ini_close();


Y para que cargue:
ini_open("mazmorra.ini");
if
ini_read_real("mazmorra","room",0) = 0
{
ini_close();
exit;
}
room_goto(ini_read_real("mazmorra","room",0));
vida = ini_read_real("mazmorra","vida",0);
player_position = ini_read_real("mazmorra","player_position",player_position);
door1 = ini_read_real("mazmorra","door1",0);
door2 = ini_read_real("mazmorra","door2",0);
ini_close();


Pero la verdad, que no sé como especificar cada cosa. Y no me funciona de ninguna de las maneras. A ver si alguien me puede orientar.

Gracias!
Título: Re:Guardar y cargar partida .INI
Publicado por: penumbra en Agosto 01, 2014, 09:39:18 PM
¿En qué eventos usas tanto la escritura como la lectura del ini?
¿Qué quieres hacer con esta instrucción?
if
ini_read_real("mazmorra","room",0) = 0
{
ini_close();
exit;
}
Título: Re:Guardar y cargar partida .INI
Publicado por: LowHertzs en Agosto 01, 2014, 09:41:02 PM
Cita de: penumbra en Agosto 01, 2014, 09:39:18 PM
¿En qué eventos usas tanto la escritura como la lectura del ini?

Mi idea es poner el evento de carga en un boton en el menú principal, solo accesible desde dicho menu.

Y el evento de carga en el (room start), no se me ocurrió mejor forma.

if
ini_read_real("mazmorra","room",0) = 0
{
ini_close();
exit;
}


Con esto mi intención es leer en el archivo "mazmorra.ini" la ultima "room" en la que se ha situado el personaje. Y cargarlo desde ahí. El problema es, que no sé como hacer tampoco que si no hay una partida guardada (por ejemplo) automáticamente vaya a la room1.
Título: Re:Guardar y cargar partida .INI
Publicado por: penumbra en Agosto 01, 2014, 10:03:32 PM
¿Agregaste el ini a la lista de Included FIles del proyecto?

La escritura (guardado) debería ir en [Room start] o [game end], eso depende de lo que quieras, pero...

Para guardar sería algo como
[gml]ini_open("mazmorra.ini");
if (room != room_start) { ini_write_real("mazmorra","room",room); }    //Guardar la habitación siempre y cuando no se esté en la habitación del menu
ini_write_real("mazmorra","vida",vida);[/gml]

La posición del jugador está dada por dos variables, x e y, pero tú estás usando sólo una variable, no entiendo por qué motivo. Ten en cuenta que para guardar la posición del jugador no es aconsejable usar el eveto room start porque la posición no estaría actualizada, se guardaría la posición en la que comienza el jugador en la habitación, no la posición en la que termina el jugador cuando acaba el juego. Aquí tienes que decidir si usar el evento STEP o el evento GAME END para guardar la posición del jugador
[gml]ini_write_real("mazmorra","player_x", x);
ini_write_real("mazmorra","player_y", y);
ini_write_real("mazmorra","door1",closed);
ini_write_real("mazmorra","door2",closed);
ini_close();[/gml]

Cita de: LowHertzs en Agosto 01, 2014, 09:41:02 PM
El problema es, que no sé como hacer tampoco que si no hay una partida guardada (por ejemplo) automáticamente vaya a la room1.

El ini original debería tener algo como
[mazmorra]
room = 0

Y luego , al cargar el ini en [GAME START] o en el botón de cargar:
[gml]ini_open("mazmorra.ini");
var room_load = ini_read_real("mazmorra","room",0)
if (room_load == 0)
      room_goto(primera_habitacion_jugable)
else
      room_goto(room_load)
[/gml]   

y después en ROOM START cargar(leer) las demás variables.
Título: Re:Guardar y cargar partida .INI
Publicado por: LowHertzs en Agosto 02, 2014, 01:11:28 AM
Estoy intentando hacer que funcione por partes para luego añadir el resto, y así hacerlo algo más llevadero.

Para empezar en el boton de "cargar partida" del menu he puesto lo siguiente:
ini_open("mazmorra.ini");
var room_load = ini_read_real("mazmorra","room",0)
if (room_load == 0)
      room_goto(mazmorras_01)
else
      room_goto(room_load)
ini_read_real("mazmorra","player_x", x);
ini_read_real("mazmorra","player_y", y);


Lo dejé casi igual a como me lo diste tú, y solo le añadí que leyese también la posición del "jugador".

Y luego, en el "obj_player" en el evento "Game End" (para no hacer uso del "Game Start" porque tienes razón, no tiene mucho sentido) he puesto lo siguiente:
ini_open("mazmorra.ini");
if (room != mazmorras01) { ini_write_real("mazmorra","room",room); }    //Guardar la habitación siempre y cuando no se esté en la habitación del menu
ini_write_real("mazmorra","player_x", x);
ini_write_real("mazmorra","player_y", y);
ini_close();


Que se supone que debería de abrir el archivo mazmorra.ini, y aquí puse que si la room es "mazmorras_01" que es el primer nivel de mi juego lo escriba en el archivo ini. (Si no recuerdo mal se debía de poner una linea igual que esa por cada nivel, para que así se vaya guardando siempre la última, corrígeme si me equivoco.
Y también añadí que guarde la posición del jugador con el:  ini_write_real("mazmorra","player_x", x);
ini_write_real("mazmorra","player_y", y);


Al archivo .ini lo añadí en "included files" con el siguiente texto dentro:
[mazmorra]
room = mazmorras_01


Pero no me acaba de funcionar, actualmente me guarda la ultima room en la que he estado, pero la posición del personaje no, quizás estoy liandola en algún paso. Voy a seguir dándole vueltas a ver si saco que puede ser.

**MODIFICO**
Dándole vueltas ya he conseguido guardar distintas variables en el .ini, como cuando coges un objeto, se guarde que ya lo has cogido y no salga más etc, hasta aquí si consigo hacerlo funcionar aunque tengo mis dudas. ¿Esta es la mejor manera para hacer estas acciones? ¿No saturarán la memoria al poner muchos valores en el ini?.

Ahora lo que me falta es conseguir guardar la posición del "obj_player" cada vez que sale de la partida, y cargarlo desde el botón del menú. Pero por lo que he visto en ejemplos etc, hay varias maneras de hacerlo y estoy muy confundido.
Título: Re:Guardar y cargar partida .INI
Publicado por: penumbra en Agosto 03, 2014, 06:50:30 AM
Es difícil saturar la memoria haciendo un ini "grandote". Por ejemplo, un ini con 100 claves, probablemente ocupe en memoria menos o aprox. el mismo espacio que un sprite pequeño. Yo no he usado inis grandes, pero en la GMC he visto hilos en donde se hacían pruebas con inis para comparar el rendimiento entre inis y archivos de texto o el rendimiento entre el sistema nativo de GM vs dlls para manejar inis, y ahí manejaban inis con miles de claves y no había problemas.

No sé por que motivo puedes guardar la última habitación y no puedas guardar la posición del jugador. Al final guardar un número (real) siempre se hace igual, sea la coordenada del personaje, o el índice de una room, etc.

Título: Re:Guardar y cargar partida .INI
Publicado por: LowHertzs en Agosto 03, 2014, 08:47:59 PM
Mi problema está en que no lee los datos que guardo en el .ini

Para guardar la posición de mi personaje estoy usando en el evento room_end esto:
ini_write_real("posicion","player_x", x);
ini_write_real("posicion","player_y", y);


Y para cargarlo desde el botón del menú estoy usando esto:
ini_read_real("posicion","player_x", x);
ini_read_real("posicion","player_y", y);


La cuestión es que si busco el .ini la posición del jugador se escribe correctamente al salir del juego:
[posicion]
player_x=320.000000
player_y=376.000000


Pero cuando entro vuelvo a salir en otro sitio.
Título: Re:Guardar y cargar partida .INI
Publicado por: penumbra en Agosto 03, 2014, 08:54:56 PM
¿Qué código usas y en qué evento asignas el valor de player_x a la variable x?

Por si solo,[gml]ini_read_real("posicion","player_x", x);[/gml]  no asigna el valor leído a ninguna variable.
Título: Re:Guardar y cargar partida .INI
Publicado por: LowHertzs en Agosto 03, 2014, 09:00:55 PM
Cita de: penumbra en Agosto 03, 2014, 08:54:56 PM
¿Qué código usas y en qué evento asignas el valor de player_x a la variable x?

Por si solo,[gml]ini_read_real("posicion","player_x", x);[/gml]  no asigna el valor leído a ninguna variable.

Entonces estoy realmente perdido, yo pensaba que este codigo guardaba en el archivo ini bajo la seccion [posicion] la localizacion del "player_x" al valor X, pero ya veo que estoy totalmente equivocado.

En ese caso debería de crear una variable en step, que escriba el x y el y del jugador en cada momento, es a eso a lo que te refieres?
Título: Re:Guardar y cargar partida .INI
Publicado por: penumbra en Agosto 03, 2014, 09:08:29 PM
El INI no tiene manera de saber qué uso se le va a dar a los datos que se guardan en sus claves. Eso sólo lo sabe el programador. Lo único que se puede hacer es darle nombres descriptivos a las claves para tener una idea de qué información contienen, pero eso realmente no importa, cualquier valor de cualquier clave del ini se puede usar en donde sea. o único que tienes que hacer es

[gml]x = ini_read_real("posicion","player_x", x);[/gml]

y no necesariamente en STEP, puede ser en CREATE, el jugador necesita leer al menos una vez la posición desde el ini, con una sóla vez es suficiente, después ya es cuestión del jugador moverlo a donde se quiera. Es desaconsejable leer recurrentemente el INI en STEP, esto crea problemas de rendimiento.
Título: Re:Guardar y cargar partida .INI
Publicado por: LowHertzs en Agosto 03, 2014, 09:16:50 PM
Cita de: penumbra en Agosto 03, 2014, 09:08:29 PM
El INI no tiene manera de saber qué uso se le va a dar a los datos que se guardan en sus claves. Eso sólo lo sabe el programador. Lo único que se puede hacer es darle nombres descriptivos a las claves para tener una idea de qué información contienen, pero eso realmente no importa, cualquier valor de cualquier clave del ini se puede usar en donde sea. o único que tienes que hacer es

[gml]x = ini_read_real("posicion","player_x", x);[/gml]

y no necesariamente en STEP, puede ser en CREATE, el jugador necesita leer al menos una vez la posición desde el ini, con una sóla vez es suficiente, después ya es cuestión del jugador moverlo a donde se quiera. Es desaconsejable leer recurrentemente el INI en STEP, esto crea problemas de rendimiento.

Despues de esto si funciona correctamente.

Pero para aclararme el concepto, entonces lo que yo había puesto anteriormente solo era la acción de guardar los datos de la posición en el archivo ini y al iniciar leerlos, lo que me faltaba era que el personaje ejecutase dicho cambio de leerlo y ir a esa posición (por así llamarlo), ¿no?

Y gracias!, la verdad que le he dado muchas vueltas a la guía y cuesta a veces dar con lo que buscas y más aún si el nivel del que partes es nulo y intentas profundizar en gml.

***MODIFICO***
Ahora tengo problemas al cambiar de room, puesto que al estar el "proceso" de lectura y aplicación de los datos de posición en create cada vez que se crea un nuevo objeto coge los datos escritos anteriormente, y no se adecua a la room.

Aun no lo probé, pero supongo que para esto lo mejor es crear una variable global, llamada por ejemplo "carga" con valor 0, y que solo cuando pulses el botón de carga del menu se active, de esta manera solo lee los datos al cargar desde el menu y no continuamente cada vez que crea el objeto.

Había pensado en algo como esto:
if
cargando = 1
{
ini_open("mazmorra.ini");
x = ini_read_real("posicion","player_x", x);
y = ini_read_real("posicion","player_y", y);
load = 0;
ini_close();
}


¿Es lo más correcto?.
Título: Re:Guardar y cargar partida .INI
Publicado por: penumbra en Agosto 03, 2014, 09:29:34 PM
Cita de: LowHertzs en Agosto 03, 2014, 09:16:50 PM
Pero para aclararme el concepto, entonces lo que yo había puesto anteriormente solo era la acción de guardar los datos de la posición en el archivo ini y al iniciar leerlos, lo que me faltaba era que el personaje ejecutase dicho cambio de leerlo y ir a esa posición (por así llamarlo), ¿no?

Así es. Toda escritura en un INI implica que tarde o temprano, ese valor se tenga que leer y asignar a una variable en GM. Fallar y después entender lo que falla es una buena manera de entender el GML.