Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: DarkKRuleR en Marzo 27, 2011, 04:39:48 PM

Título: [Solucionado] Mostrar datos de una partida guardada sin acceder a ella
Publicado por: DarkKRuleR en Marzo 27, 2011, 04:39:48 PM
Buenas. Pues el t?tulo es muy descriptivo xDD
Yo tengo 3 botones, que, al clicarlos, guardo o cargo su correspondiente partida. Cada uno guarda la partida con un nombre, digamos "SaveGame1", "SaveGame2", "SaveGame3". El juego permite tener hasta 3 partidas distintas. La cosa es que estoy pensando en, ANTES de cargar o guardar ninguna partida... osea, sin clicar al bot?n, poder ver datos de esa partida.

Vamos, que las partidas, tendr?n, cada una, un nombre propio, podr?s introducir un nombre para hacer distinta la partida. Y quiero que, antes de cargar una partida o guardar encima, ver el nombre de ?sta y una variable de ?sta. Es posible? Osea, sin guardar o cargar tal partida. Yo hago game_save y game_load. Quiero poder ver, por ejemplo, en el bot?n 1, hay guardada "SaveGame1". C?mo puedo ver dos variables que contiene un objeto en esa partida, sin cargarla?? Es posible? Estoy seguro que la manera ser?a creando un archivo de texto con esos datos en una carpeta del juego, a la que el usuario no deber?a poder acceder, y esta carpeta contener estas dos variables, para cada slot, para mostrarlas... c?mo se har?a?
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: Masterkey en Marzo 27, 2011, 05:17:49 PM
Puedes hacerlo con archivos *.ini
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: Ge en Marzo 27, 2011, 05:26:29 PM
Suponiendo que ya pudiste guardar el archivo de texto, te quedaria algo haci (En el caso de que uses un texto plano y no un ini, aunque la idea de master es bastante buena):

Citar10
30
13
23
34
12

Ejemplo, 10 de salud y 30 de municion para la primera partida, y haci consecutivamente hasta la tercera partida.
Para leer estos valores y mostrarlos, se usa, draw_text, okey, en un objeto, en el evento create, tendrias que poner esto:
[gml]ArchivoDeDatos = file_text_open_read("DireccionSecreata/Datos.txt")

Slot1Salud = file_text_read_real(ArchivoDeDatos) //Se usa read REAL, por que es un valor numerico
file_text_readln(ArchivoDeDatos) // Se usa para avanzar una linea hacia abajo, haci se empieza a leer, pero desde la linea siguiente
Slot1Municion = file_text_read_real(ArchivoDeDatos)

file_text_readln(ArchivoDeDatos)
Slot2Salud = file_text_read_real(ArchivoDeDatos)
file_text_readln(ArchivoDeDatos)
Slot2Municion = file_text_read_real(ArchivoDeDatos)

file_text_readln(ArchivoDeDatos)
Slot3Salud = file_text_read_real(ArchivoDeDatos)
file_text_readln(ArchivoDeDatos)
Slot3Municion = file_text_read_real(ArchivoDeDatos)

file_text_close(ArchivoDeDatos) // Se cierra el archivo haci no consume memoria[/gml]
y despues en el evento draw
[gml]
draw_text(x,y,"Slot1 Salud: "+string(Slot1Salud))
draw_text(x,y+16,"Slot1 Municion: "+string(Slot1Municion))
draw_text(x,y+32,"Slot2 Salud: "+string(Slot2Salud))
draw_text(x,y+48,"Slot2 Municion: "+string(Slot2Municion))
draw_text(x,y+64,"Slot3 Salud: "+string(Slot3Salud))
draw_text(x,y+96,"Slot3 Municion: "+string(Slot3Municion))
[/gml]

Finalmente, el draw tendria que dibujar algo haci:

Slot1Salud: 10
Slot1Municion: 30
Slot2Salud: 13
Slot2Municion: 23
Slot3Salud: 34
Slot3Municion: 12


Espero que te sirva  :)


EDIT:
Ahora que leo el post por segunda ves , ahora tengo la duda, si lo que realmente quer?as era "guardar los datos en un archivo" o "leer los archivos". En todo caso avisame y te ayudo.  :-[ , perd?n si conteste equivocadamente. :)
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: DarkKRuleR en Marzo 27, 2011, 05:40:20 PM
Lo siento Masterkey, ni idea de qu? son esos archivos =S
Ge, por lo que veo, guardas en variables... eso lo entiendo, pero... para leer las variables de ese archivo, cu?ndo las has guardado?

Lo que quiero es que NO SE GUARDEN los datos en el txt, sino en el juego; el txt s?lo toma los datos de las partidas para poder dibujarlos sin cargarlas. En ese caso, c?mo har?a para que el txt no fuera legible? Osea... deber?a crearlo en alguna parte del disco C inaccesible? Porque, si ese txt fuera editado, NO INFLUIR?A NADA, o no deber?a, en el juego, ya que s?lo sirve para dibujar los datos de la partida. La idea es que al guardar una partida, los datos de ?sta sean escritos en ese txt.

Ge, c?mo har?a para checar si no hay creado un txt en alguna parte del disco duro para que no sea descubrible por el jugador, si no est? creado, lo crea, y luego que guarde unas variables en el juego y las escriba en el txt? Todo eso al guardar partida. Entonces, a la hora de cargarla, dibujar?a las variables ley?ndolas en el txt igual que has hecho en tu anterior post!

S?lo me falta eso, c?mo crear el texto y guardar variables del juego en el txt. Una vez hecho eso, creo que con lo que pusiste, podr?a leer los datos para mostrarlos. Y repito, el txt no afecta nada en el juego, es s?lo para leer datos: TODOS se guardan en el propio juego.
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: Ge en Marzo 27, 2011, 06:12:51 PM
Citar... para leer las variables de ese archivo, cu?ndo las has guardado?
Este archivo de datos del que hablo, se guardaria/crearia cada vez que se guarda una partida.

CitarLo que quiero es que NO SE GUARDEN los datos en el txt, sino en el juego;
Guardar los datos en el juego, lo veo algo complicado (Por lo menos con las funciones nativas del Game Maker), las unicas soluciones para guardar datos de un juego, si no me equivoco son: Archivos Ini , Archivo de Textos (Como el de mi ejemplo), Archivos Binarios (Estos un tanto ilegibles), o Entradas en el registro de windows (Estan mas o menos ocultas para un usuario comun, pero de igual manera son vulnerables a modificaciones)

CitarEn ese caso, c?mo har?a para que el txt no fuera legible?
Para que un archivo de texto no sea legible, existen extenciones en DLL, que te perminen encriptar los archivos bajo una contrase?a y desencriptarlos solo para que el juego pueda leerlos.
Podes encontrar estos DLL en http://www.gmtoolbox.com/ , en donde dice "Encryption / Hashing"
Otra solucion para que no se puedan modificar, es guardar los datos en un archivo binario. Estos archivos se crear similar a los archivos de texto, y con funciones nativas del GM, por ejemplo, antes de guardar una partida:
[gml]Archivo = file_bin_open("Datos.ge",1) // Se abre un archivo(O se crea si no existe), el 1 indica que se va a utilizar para escribir
file_bin_seek(Archivo,0) //Se mueve al bite indicado, en este caso 0
file_bin_write_byte(Archivo,objJugador.Salud) //Escribe el bite, en este caso la salud del jugador
file_bin_seek(Archivo,1)
file_bin_write_byte(Archivo,objJugador.Municion)
file_bin_close(Archivo)
[/gml]
Si, no me equivo tendria que escribir correctamente un archivo, solo recorda que se escriben valores numericos que esten dentro del rango del 0 al 255. Esta solucion es mas o menos sencilla comparada con la de encriptar, pero recomiendo la encriptacion  :-[

Citardeber?a crearlo en alguna parte del disco C inaccesible?
Puede ser una alternativa, pero lo complicado es encontrar las rutas correctas, por ejemplo hay sistemas que utilizan discos D o E, o en mi caso algo que me sucedio, que al intentar guardar archivos en carpetas como System32 o Windows en antivirus no me dejaba hacerlo.

Citarc?mo har?a para checar si no hay creado un txt en alguna parte del disco duro para que no sea descubrible por el jugador, si no est? creado, lo crea, y luego que guarde unas variables en el juego y las escriba en el txt?
Para detectar si existe un archivo, se usa la funcion "file_exists(fname)". Por ejemplo:
[gml]if(file_exists("RutaSuperSecreta/Datos.txt") = true)
{
show_message("El archivo existe")
}[/gml]
Recorda, que las funciones file_text_open_read, en el caso de que el archivo no exista, lo crea automaticamente. De este modo no seria necesario detectar o no la existencia del archivo, por que: Si existe, modifica el archivo existente. Si No existe, crea un archivo en blanco.

CitarS?lo me falta eso, c?mo crear el texto y guardar variables del juego en el txt.
Antes de guardar, una partida, seria necesario esto (El ejemplo es del Slot1)
[gml]Archivo = file_text_open_write("Datos.txt")
file_text_write_real(Archivo,objJugador.Salud)
file_text_writeln(fileid)
file_text_write_real(Archivo,objJugador.Municion)
file_text_close(fileid)
game_save("JuegoGuardado1.sav")[/gml]

En el caso del slot 2, es lo mismo pero con distintas lineas(El ejemplo es del Slot2)
[gml]Archivo = file_text_open_write("Datos.txt")
file_text_writeln(fileid)
file_text_writeln(fileid)
file_text_write_real(Archivo,objJugador.Salud)
file_text_writeln(fileid)
file_text_write_real(Archivo,objJugador.Municion)
file_text_close(fileid)
game_save("JuegoGuardado2.sav")[/gml]

Para el slot3 es lo mismo, pero hay que agregarles "file_text_writeln", para ubicar los datos en las lineas correctas

CitarY repito, el txt no afecta nada en el juego, es s?lo para leer datos: TODOS se guardan en el propio juego.
Hasta donde yo se, es algo complicado, pero repito quizas exista un DLL, pero no lo conozco XD , sigo recomendando escribir un archivo y encriptarlo (Aunque la opcion de archivos binarios es una alternativa mucho mejor)

Okey,

EDIT:
Wow, no crei qe iba a ser tan largo  :-[
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: DarkKRuleR en Marzo 27, 2011, 07:07:41 PM
wow, gracias xD!
aver... porqu? dices que cuesta guardar en el propio juego? Yo guardo partida con game_save(); y automaticamente guardo el avance. Al cargar partida, las variables permanecen. Osea... guardar las variables en el juego es lo m?s f?cil, es simplemente cargar partida. El problema es que NO HAY que crear y destruir el txt. Osea, si yo guardo partida, paso los datos del juego al txt. Y ese txt no debe ser borrado, puesto que, si cierro el juego y lo abro al d?a siguiente, debo seguir teniendo el txt para dibujar los datos de cada partida...

Vale, entonces har? file_text_open_read, lo cual me CREA el archivo. Ese archivo nunca debe ser borrado de ninguna manera, ya que servir? para guardar datos para luego dibujarlos. Repito, que los datos los guarda el propio SAVEGAME del juego, el txt es s?lo para dibujarlos, no influye en el juego.

Bien, mirar? lo que dijiste de encriptar con una DLL el archivo o hacerlo binario, y cuento c?mo me fue. De momento tienes un karma =)
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: Masterkey en Marzo 27, 2011, 07:26:18 PM
Ge se refiere a que por ejemplo las variables no se cargan autom?ticamente, si no que tienes que darle load. A ver si me explico... Si por ejemplo en el ?ltimo juego tuviste una puntuaci?n de 50 puntos, y luego reinicias el juego no hay forma de mostrar ese puntage a no ser que se cargue la partida.
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: Iros en Marzo 27, 2011, 07:27:57 PM
DarkKRuleR, te recomiendo un par de t?cnicas para encriptar, el nivel 0: Ponerle la extensi?n de una dll *.dll porque casi nadie se anima a abrir esos archivos xD.

Nivel 1: Utilizar el script de nuestro amigo Fenris78 para Codificar/Decodificar cadenas (http://www.comunidadgm.org/index.php?topic=14247.0)
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: DarkKRuleR en Marzo 27, 2011, 08:28:17 PM
Masterkey, lo que dec?a Ge, que si no guardas los datos no son guardados, es exactamente eso xD
Tengo que decir, gracias Ge! He conseguido implantar los c?digos con ?xito, por las pruebas realizadas! Al comenzar el juego, salen tres botoncitos, uno por slot. Si clicas al boton de nueva partida, te pide introducir un nombre para la partida. En los tres botones de abajo, son 3 slots, te dice si hay partida o no. Dentro del juego puedes guardar en esos 3 slots, y he conseguido guardar los datos b?sicos, as? que, si cargas desde el "men? principal" o el men? de pausa, al pasar por cada slot, si hay una partida guardada, te dice los datos. B?sicamente te muestra DOS datos de ESA partida: el nombre de la partida introducido al principio de ?sta, y el rango del usuario (se podr?a decir el nivel, que va de 1 a 5, indica el progreso b?sicamente, ya que aumentar?s de rango al cumplir misiones especiales).

La cosa, cada savegame es un archivo, y tambi?n se crea UN TXT por cada uno. Osea, que hay un txt por cada savegame. Al final me quedo con 3 txt, uno para cada partida, lo que no est? nada mal.

Iros, gracias por ese script de Fenris. Me lo he mirado, y... bueno, tengo que mir?rmelo m?s a fondo xD

PERO HE PENSADO que no s? si har? falta. Osea, si yo aviso en el l?eme (Archivo que HAY que leer, se llama "Importante, l?eme o la liar?s parda", he puesto que no hay que editar ning?n nombre ni borrar nada. SI PONGO adem?s que NO HAY que borrar ni que editar los 3 archivos de texto, que editando los valores no consigues nada ya que s?lo son para ayudarte a la hora de cargar partida, estoy seguro que no corren peligro, al igual que aviso que no hay que borrar ni cambiar nombres de nada, aviso que esos archivos no sirve de nada editarlos, al rev?s, empeoran, puedo dejarlos tal cual junto al juego y los savegames. No?  :P
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: Ge en Marzo 27, 2011, 08:52:36 PM
Gracias, y es verdad, decirle a los usuarios que no modifiquen nada es buena idea, ya que podria ser muy frustrante perder todos los progresos.

Y la idea de Iros, de cambiarle la extencion a los tres archivos, como por ejemplo a DLL, mejoraria mucho mas las cosas, es mas, se me ocurre que podrias guardarlos en formato EXE haci de este modo se desabilita la funcion abrir con.  XD

Okey, gracias! y que bueno que te halla servido!
+1 Vuelve!
Título: Re: Mostrar datos de una partida guardada sin acceder a ella
Publicado por: DarkKRuleR en Marzo 27, 2011, 09:59:01 PM
Por eso lo avisar? en el "Importante: l?eme o la liar?s parda". Pero por si acaso, lo mismo que dice el archivo l?eme lo avisar? dentro del juego, as? no hay posibilidad de no saberlo :3
as? que t?cnicamente solucionado, lo dejar? tal cual y avisar? =)