PDA

Ver la versión completa : Ayuda guardando partida(varios datos)



Neodreamer
02/09/2005, 03:39
Hola, se q esta pregunta se ha hecho mucho e incluso se me ha respondido a mi mismo, pero no exactamente como necesitaba asiq me explico otra vez a ver si me podeis ayudar como de costumbre q ha sido bastante.
El caso es q se como guardar un dato en un fichero y luego rescatarlo, ya sean puntos de un juego u otros datos x poner ejemplos.
Ahora, estoy (o sigo) con mi intento de juego de rpg tipo zelda y mi duda se refiere al momento de guardar datos del tipo:

espada=0 //donde 0 no se tendria y 1 si
nivel=1 // la cifra indica el nivel
vida=4 // numero de marcas de vida q quedarian
....etc

Alguien me hace el favor de poner el codigo a modo de ejemplo para q esto funcione?
Es q creo q seria con arrays o algo asi, pero no se como accederia a la parte del archivo o memoria q contendria x ejemplo el dato nivel....ya q si no me equivoco, al cargar el archivo se vuelca el contenido de este a una variable file o algo asi....no lo tengo muy claro asiq si me ayudais os lo agradezco muchisimo.

1saludo y mil gracias

D_Skywalk
02/09/2005, 15:20
espada=0 //donde 0 no se tendria y 1 si
nivel=1 // la cifra indica el nivel
vida=4 // numero de marcas de vida q quedarian
....etc

Es q creo q seria con arrays o algo asi, pero no se como accederia a la parte del archivo o memoria q contendria x ejemplo el dato nivel....ya q si no me equivoco, al cargar el archivo se vuelca el contenido de este a una variable file o algo asi....

1saludo y mil gracias

A ver, no se si esta ya por ahi explicado, pero yo lo haria de la siguiente forma:


Creamos una estructura con todos los datos que necesitamos guardar, ej:


struct DatosImportantes{

unsigned short espada;
unsigned int nivel;
short vida;
char nombre[255];

}


Suponiendo que tenemos:
- Datos, como una estructura que hemos creado y la cual contiene los datos del juego.
- fp, que es una variable tipo "F_HANDLE"
- leido, que es un dato tipo "ulong" que necesita obligatoriamente GpFileRead, donde se guardan los bytes leidos.

Guardariamos los datos de la estructura con:


GpFileWrite(fp,&Datos,sizeof(DatosImportantes));


Y los recuperariamos con:


GpFileRead((F_HANDLE)fp, &Datos, sizeof(DatosImportantes), (ulong*)&leido);


Recuerda que debes abrir el fichero con "GpFileOpen" y cerrarlo una vez leas con "GpFileClose"

Un Saludo y si tienes mas dudas a ver si te puedo ayudar ;-)

Puck2099
02/09/2005, 15:39
D_Skywalk, creo que él lo preguntaba para hacerlo en Fenix ;)

De todos modos, tu explicación me ha sido muy útil a mi, pues yo guardaba los datos en formato ascii y hacía cosas "complicadas" para recuperarlos, cuando con tu ejemplo parece muy sencillo :)

Saludos

Neodreamer
02/09/2005, 15:42
Guauuuu!!!!!
Si, me referia en Fenix, aun asi gracias x el esfuerzo. Sabriais como hacerlo en Fenix?
Gracias y 1saludo

D_Skywalk
02/09/2005, 15:46
Perdona no me habia fijado que era el foro de Fenix, esto que te he escrito es en C usando el SDK Oficial... xD :loco:

Segun he leido en la doc (no se si desactualizada) tienes un fwrite y fread, bien pues lo que tendrias que hacer es crear esa estructura y luego...

Para guardar supongo que sera algo como:


if( FWRITE ( fpDeFopen, Datos ) !=0)
print("ok!");
else
print("Error: No pude guardar el contenido.";




Para leer sera algo como:


if( FREAD (fpDeFopen, Datos ) !=0)
print("ok!");
else
print("Error: No pude leer el contenido.";


Y nos meteria los datos que almacenamos en "Datos" :-)

Un Saludo y supongo que sera mas o menos asi, tu trastea a ver que pasa ;-)

[Update]

Acabo de leer esto por un foro... xD



struct cosa
int mascosas;
int menoscosas;
struct mochila[27]
int x;
int y;
end
end


Y luego para guardarlo hace:


save(cosa,"fichero.cfg");
o bien

load(cosa,"fichero.cfg");

Hace muchos años que no hago nada en Div/Fenix, espero que esto te valga ;-)

[Update 3]

Nada dice en la documentacion que la funciones SAVE y LOAD estan obsoletas y que no las uses, en su lugar usa FWRITE y FREAD...



int fwrite (int fichero, pointer datos, int bytes)

int fread (int fichero, pointer datos, int bytes)


No me voy a extender mas ya que el uso lo tienes arriba

D_Skywalk
02/09/2005, 16:40
D_Skywalk, creo que él lo preguntaba para hacerlo en Fenix ;)

De todos modos, tu explicación me ha sido muy útil a mi, pues yo guardaba los datos en formato ascii y hacía cosas "complicadas" para recuperarlos, cuando con tu ejemplo parece muy sencillo :)

Saludos

Sip, es que uno esta ya viejo y no lee bien xDD

Y si en realidad recuperar datos de estructuras es muy simple, se hace en 3 pasos: abrir, leer, cerrar :D

Un Saludo

Neodreamer
02/09/2005, 16:57
Muchas gracias, pero sigo sin saber el paso importante, q es el paso de la estructura a las variables del juego....
Si no me equivoco, el archivo .cfg ese q crea el ejemplo, es texto puro y duro...en el caso de los ejemplos q yo he visto x internet, dentro de ese fichero se metia solo una cifra:
Por ejemplo:
----------------------
vida=100; //el .cfg guardaria 100 de modo q al leer el archivo pasase todo su contenido a la variable usada para la apertura y lectura del fichero.
-----------------------
Lo q no consigo saber yo es como sacar de un fichero como ese, ya sea txt, cfg o la extension q queramos, los distintos datos de la estructura creada y supuestamente guardada.

1saludo y gracias

p.d: si podeis poner el codigo con explicacion del paso de variables (del juego a fichero y del fichero a juego, con sus estructuras y variables)

D_Skywalk
02/09/2005, 17:50
Muchas gracias, pero sigo sin saber el paso importante, q es el paso de la estructura a las variables del juego....
Si no me equivoco, el archivo .cfg ese q crea el ejemplo, es texto puro y duro...en el caso de los ejemplos q yo he visto x internet, dentro de ese fichero se metia solo una cifra:
Por ejemplo:
----------------------
vida=100; //el .cfg guardaria 100 de modo q al leer el archivo pasase todo su contenido a la variable usada para la apertura y lectura del fichero.
-----------------------


¿pero que haces suponiendo? por que no te pones a mirar tardas 3 segs en hacer un ejecutable que te guarde algo con fwrite y fread, luego cuentanos que ocurre pero sino vas tu probando poco te vamos/voy a poder ayudar...


Lo q no consigo saber yo es como sacar de un fichero como ese, ya sea txt, cfg o la extension q queramos, los distintos datos de la estructura creada y supuestamente guardada.

1saludo y gracias

p.d: si podeis poner el codigo con explicacion del paso de variables (del juego a fichero y del fichero a juego, con sus estructuras y variables)

Joe nen, pero si te lo he dado todo hecho solo hay que juntar xD

Mira como toy aburrio te digo 4 cosas y ya trasteas tu con los webos xP



struct mDatosImportantes
int vida;
int espada;
int nivel;
end


Bien si tenemos eso y ahora queremos guardar todos esos datos, abrimos el fichero con fopen (mira la documentacion para mas info)

Ahora si queremos guardar los datos del personaje, hacemos:


int fp;
mDatosImportantes Datos;

if((fp = fopen ("savegame.dat", o_readwrite))==0){
print("MAL! FALLO! NO SE ANDESTA EL PUT0 FICHERO DE LOS...");
exit(1);
}

if( fwrite(fp, &Datos, sizeof(DatosImportantes)) == 0){
print("CHINGON DEJA DE BAJAR PORN QUE NO PUEDO GUARDAR!! CHANFLE!");
exit(1);
}

fclose(fp);




Y para cargar la partida leemos el contenido del fichero:



int fp;
mDatosImportantes Datos;

if((fp = fopen ("savegame.dat", o_readwrite))==0){
print("MAL! FALLO! NO SE ANDESTA EL PUT0 FICHERO DE LOS...");
exit(1);
}

fread (fp, &Datos, sizeof(DatosImportantes));
// fread tiene un int pero en la doc no dicen que valores son correctos o no asi que lo dejamos asin a su aire xD

fclose(fp);



Un Saludo y mas codear y menos preguntar :p

Neodreamer
02/09/2005, 19:49
Tranqui tron...y muchas gracias, pero es q no sabia ni por donde empezar, de echo, viendo tu ejemplo entiendo q como y xq lanzas los mensajes de error, pero no entiendo como escribes o lees los datos de la estructura q has creado....q si, q lo pruebe....pero sin entender nada no me meto a teclear x teclear y lo q pido es q me ayudeis a entender para luego yo modificar y entenderlo mas aun....

Por ahora veo q declaras la estructura, q abres el fichero y si no se puede muestras error, pero esto no se exactamente q hace:

if( fwrite(fp, &Datos, sizeof(DatosImportantes)) == 0){
print("CHINGON DEJA DE BAJAR PORN QUE NO PUEDO GUARDAR!! CHANFLE!");
exit(1);
}

Y luego en la lectura del archivo, haces lo mismo, abres, si esta mal da error o el mensaje q quieras, pero q haces con los datos de la estructura? vamos, q significa esta linea?

fread (fp, &Datos, sizeof(DatosImportantes));

No se si la pregunta la hago mal o es q no entiendo lo q me dices, pero lo q quiero saber es si al leer DatosImportantes conlleva q lea todas las variables declaradas al principio o habria q llamarlas de una en una como en las estructuras en plan (DatosImportantes.vida)
Entiendes mi duda?, q no entiendo bien la mecanica de estructuras, ficheros y llamada de variables dentro de las/los mismos....Si pudieses darle valores a las variables de la estructura del ejemplo q has hecho a lo mejor lo veo y ya me muerde y todo....

Siento la pesadez pero hace mazo q no toco la programacion y me ayudais mazo.

Gracias y 1saludo

Puck2099
02/09/2005, 21:35
Creo que te puedo responder yo.

Cuando creas la estructura, ésta se guarda en un bloque de memoria consecutivo de un tamaño x.

Al escribirla en el disco, escribes lo que hay desde la posición de memoria donde empieza la estructura hasta donde termina. Al leer del disco, haces lo contrario, cargas del disco los datos a la posición de memoria donde está almacenada la estructura.

¿Qué conseguimos así?, pues no tener que diferenciar en variables para salvarlas o escribirlas, sino hacerlo de golpe gracias a la estructura.

Si sigues sin entender dímelo y me intento explicar mejor :)

Saludos

Neodreamer
03/09/2005, 11:22
Creo q si, pero sigo sin entender una cosa y es xq no me explico bien....(ahora ya estoy seguro de q es culpa mia jeje)
En el ejemplo sobre estructuras de www.tutorialgames.net/fenix trataban las estructuras de forma bidimensional del tipo:

struct naves[5]
x_nave[3];
y_nave[3];
end

De modo q para acceder a un valor habria q poner por ejemplo naves.x_nave[4] o algo asi q no se hacer bien y en el ejemplo q me habeis puesto, tratamos con variables simples dentro de una estructura de una dimension.....es mucha burrada lo q digo????
Por tanto si no me equivoco, lo q me decis es q en este caso, al leer la estructura del disco, podre acceder a cada variable llamandolas como tal????

struct mDatosImportantes
int vida;
int espada;
int nivel;
end

Como accederia al dato de vida y nivel (por ejemplo) una vez metido en una variable la estructura?

int fp;
mDatosImportantes Datos;

if((fp = fopen ("savegame.dat", o_readwrite))==0){
print("MAL! FALLO! NO SE ANDESTA EL PUT0 FICHERO DE LOS...");
exit(1);
}

fread (fp, &Datos, sizeof(DatosImportantes));

Y xq en la estructura añade Datos???? la estructura no es mDatosImportantes???
fp la variable a q se asigna el fichero para ser leido y/o escrito pero Datos????
Me parece q en fenix no era tan complejo usando fputs u fgets o algo asi.....o eso me dijeron cuando pregunte para guardar una sola variable

De todos modos gracias x todo lo dicho hasta ahora.

Puck2099
03/09/2005, 15:08
Creo q si, pero sigo sin entender una cosa y es xq no me explico bien....(ahora ya estoy seguro de q es culpa mia jeje)
En el ejemplo sobre estructuras de www.tutorialgames.net/fenix trataban las estructuras de forma bidimensional del tipo:

struct naves[5]
x_nave[3];
y_nave[3];
end

De modo q para acceder a un valor habria q poner por ejemplo naves.x_nave[4] o algo asi q no se hacer bien y en el ejemplo q me habeis puesto, tratamos con variables simples dentro de una estructura de una dimension.....es mucha burrada lo q digo????
Por tanto si no me equivoco, lo q me decis es q en este caso, al leer la estructura del disco, podre acceder a cada variable llamandolas como tal????

struct mDatosImportantes
int vida;
int espada;
int nivel;
end

Como accederia al dato de vida y nivel (por ejemplo) una vez metido en una variable la estructura?

En Fenix no sé exactamente como será, pero visto el ejemplo supongo que pones, supongo que se accederá como en C, por ejemplo:


datos.vidas = 3;

Así asignas 3 vidas al personaje.



int fp;
mDatosImportantes Datos;

if((fp = fopen ("savegame.dat", o_readwrite))==0){
print("MAL! FALLO! NO SE ANDESTA EL PUT0 FICHERO DE LOS...");
exit(1);
}

fread (fp, &Datos, sizeof(DatosImportantes));

Y xq en la estructura añade Datos???? la estructura no es mDatosImportantes???
fp la variable a q se asigna el fichero para ser leido y/o escrito pero Datos????
Me parece q en fenix no era tan complejo usando fputs u fgets o algo asi.....o eso me dijeron cuando pregunte para guardar una sola variable

De todos modos gracias x todo lo dicho hasta ahora.

mDatosImportantes es un tipo de datos, la estructura, y Datos es una variable del tipo mDatosImportantes.

¿Se entiende? :)

Saludos

Neodreamer
04/09/2005, 19:39
Lo siento pero lo habia entendido mejor o de otra forma hasta ahora.....lo q me dices me resulta redundante a mas no poder....
Lo unico q no me entra es la ultima linea q has puesto:

mDatosImportantes es un tipo de datos, la estructura, y Datos es una variable del tipo mDatosImportantes

Me estas diciendo algo asi como la casa es de madera y la madera forma parte de la casa.....?¿?

Gracias de todos modos y perdona mi ignorancia pero me cuesta un webo entender esto como en su momento los punteros en C....

Repito q si podeis hacer un ejemplo de llamar a una de las variables de la estructura me aclararia todo...a ser posible en fenix.

Os pongo los pasos y el q pueda q me lo transcriba a fenix please:

1. Creamos la estructura con vidas, espada, nivel.
2. Grabamos en disco distintas variables para esos datos.
3. Los cambiamos en el juego( por ejemplo el numero de vidas).
4. Volvemos a grabar.
5. Lo lemos o rescatamos para mostrar q se ha grabado bien o q se ha actuaizado(en mi caso para continuar una partida con dichos datos anteriores).

Gracias y 1saludo

D_Skywalk
05/09/2005, 11:18
Lo siento pero lo habia entendido mejor o de otra forma hasta ahora.....lo q me dices me resulta redundante a mas no poder....
Lo unico q no me entra es la ultima linea q has puesto:

mDatosImportantes es un tipo de datos, la estructura, y Datos es una variable del tipo mDatosImportantes

Me estas diciendo algo asi como la casa es de madera y la madera forma parte de la casa.....?¿?


Olvidate de eso que en fenix acabo de leer que no es igual que en C, sigue leyendo y libera tu mente de preguntas... neo :-D


Gracias de todos modos y perdona mi ignorancia pero me cuesta un webo entender esto como en su momento los punteros en C....

Repito q si podeis hacer un ejemplo de llamar a una de las variables de la estructura me aclararia todo...a ser posible en fenix.


Ok, creo que te lo han puesto un par de veces pero lo repito, en fenix es:


STRUCT personaje
int vida;
int espada;
int nivel;
END

Con esto tendriamos una estructura (STRUCT) personaje que podriamos cambiar la vida, espada, etc... pero no seria como en C que tenemos el tipo y si queremos usarlo tendriamos que crear una variable de ese tipo, sino que en fenix una vez que lo declaras (es decir, creas) ya es "usable" en el programa.

Si lo que quieres es tener como una plantilla con esos datos y usarlos en multiples personajes usa TYPE, que seria como la estructura que antes te hemos dicho que usamos nosotros en C. Tu creas el tipo de dato (en nuestro ejemplo mDatosImportantes) y luego creamos una variable con esa estructura (en nuestro ejemplo Datos) para usarla por ejemplo en nuestro personaje o en cualquier otro PNJ que necesitemos.



TYPE hojapnj
int espada;
int vida;
int dinero;
int experiencia;
END


Esto que hemos "creado" no es una variable que podamos usar, no; imaginate que es un papel en blanco con un esquema que podemos ahora dar a compañeros, y ellos podran usar... bien, los compañeros serian las variables, EJ:

Ahora crearemos variables (compañeros) globales que podremos usar en todo el programa que seran del tipo que acabamos de crear: "hojapnj":



GLOBAL
hojapnj tanis;
hojapnj piepeludo;
hojapnj penejota;
END


Finalmente para acceder a un dato (tanto TYPE como STRUCT) se hace igual que en C, en nuestro ejemplo de la estructura quedaria algo como:


personaje.vida=100;


Y en nuestro ejemplo del la plantilla seria:


tanis.vida=100;


Como ves es lo mismo, solo que cada una depende del uso que le vayas a dar tu, y usar la que te sea mas comoda ;-)


Os pongo los pasos y el q pueda q me lo transcriba a fenix please:

1. Creamos la estructura con vidas, espada, nivel.
2. Grabamos en disco distintas variables para esos datos.
3. Los cambiamos en el juego( por ejemplo el numero de vidas).
4. Volvemos a grabar.
5. Lo lemos o rescatamos para mostrar q se ha grabado bien o q se ha actuaizado(en mi caso para continuar una partida con dichos datos anteriores).

Gracias y 1saludo

Bueno, se supone que eso seras capaz de hacerlo tu mismo cuando lo entiendas todo, si haces un copiar/pegar de lo que alguien te ponga, de nada habra valido tanta explicacion, creo yo...

Un Saludo

Neodreamer
05/09/2005, 17:36
Mil millones de gracias, aunq parezca tonto o simple, creo q esto es justo lo q pedia.
Gracias, ahora si q me puedo poner a hacer pruebas de ficheros....
1saludo y lo dicho, muchas gracias a todos

Neodreamer
05/09/2005, 18:18
Ele, no lo consigo....la teoria bien pero la practica.....
Aqui os dejo mi ejemplo probado y compilado para q me digais q esta mal o xq cuando grabo no guarda los datos q yo quiero y xq la funcion fgets no me coge la estructura datos de miFichero.....

Ya me direis.
1saludo y gracias

D_Skywalk
05/09/2005, 18:30
Ele, no lo consigo....la teoria bien pero la practica.....
Aqui os dejo mi ejemplo probado y compilado para q me digais q esta mal o xq cuando grabo no guarda los datos q yo quiero y xq la funcion fgets no me coge la estructura datos de miFichero.....

Ya me direis.
1saludo y gracias

por que usas fputs? usa fread... mira en los ejemplos anteriores como usarlo.

Un Saludo

PD: "global miFichero;" no tienes que decirle el tipo de dato que es? mejor ponle int...

PD2: No se si es que fenix te obliga pero: "global struct datos[0]" si es "0" con poner "global struct datos" es suficiente...

Neodreamer
05/09/2005, 18:57
Pues va aser q si.....Struct al ser simple se puede prescindir de [0], gracias.
En fenix, los datos se declaran sin int xq lo toma x defecto, aun asi, gracias.
Y sobre todo, gracias x lo del fread y fwrite, es q en otro foro me dijeron q daban algun fallo pero lo q no me dijeron es q fput y fgets era solo para cadenas...de ahi mi incomprension del trato de estructuras desde ficheros y demas.....
Una vez mas muchas gracias....he probado el ejemplo y creo q me vale perfectamente.
Ahora me toca ponerme con el diseño grafico q me resulta muy coñazo y lento pero tengo septiembre antes de empezar las clases asiq a ver si puedo poner alguna version de prueba de lo q pretendo hacer.
1saludo y seguid asi.
p.d: os di las gracias? pues eso, gracias por la paciencia y ayuda

D_Skywalk
05/09/2005, 19:02
Un Placer y a mandar ;)

Un Saludo :D

Drumpi
22/09/2005, 09:53
Jubar, que lio estais montando!
El manejo de ficheros es bastante mas sencillo en Fenix (sobre todo si separais los pasos). El uso de SAVE y LOAD, aunque digan que estan obsoletos, son de lo mas sencillo de usar, pero tiene la pega de que solo puedes guardar una estructura al tiempo. Asi que vamos a intentarlo usando FREAD Y FWRITE

Lo primero que tienes que hacer es abrir el fichero donde vas a leer o guardar:
archivo=FOPEN (nombre,forma)
Donde nombre es el que le quieras poner (siempre entre comillas), por ejemplo "datos.dat". La forma depende de lo que quieras hacer, si miras la ayuda veras mas modos que los que voy a decir, los interesantes son:
O_WRITE: abre el archivo, borrando todo su contenido, para reescribirlo.
O_READ: abre el archivo en modo "solo lectura"
O_READWRITE: abre el archivo sin borrar nada, permitiendo "sobreescritura"
En todos los casos, si el archivo no existe, se crea nuevo. archivo en una variable que creas, digamos que es la ID del fichero, y cuando queramos referirnos a el, lo haremos con esa variable.

Supongamos que queremos guardar una estructura:
STRUCT yo
---int x
---int y
---byte energia
END

una vez abierto en modo escritura (archivo=FOPEN("datos.dat",O_WRITE)) empezamos a guardar los datos UNO A UNO, para ello usamos
FWRITE(id_fichero,variable,tamaño)
En las ultimas versiones de Fenix se ha suprimido el tamaño, por lo que para guardar nuestra struct seria escribir las siguientes lineas:

FWRITE (archivo, yo.x)
FWRITE (archivo, yo.y)
FWRITE (archivo, yo.energia)

En las anteriores seria algo como: FWRITE (archivo, yo.x, size_of(int))
Como ves, hemos usado "archivo" como el identificador del fichero, nunca olvides que es nuestra referencia.

Una vez guardados todos los datos hay que cerrar el fichero, de lo contrario podrian pasar los tipcos "fenomenos paranormales del ordenador", tan sencillo como FCLOSE (id_fichero), en este caso:
FCLOSE (archivo)
¡¡¡Ya hemos grabado el archivo!!! Ahora queda leerlo. Suponemos que queremos usar la misma estructura, a menos que tengas una para leer y otra para escribir, pero vamos a usar la misma. Vamos con turbo:

archivo=FOPEN("datos.dat",O_READ)
FREAD (archivo, yo.x)
FREAD (archivo, yo.y)
FREAD (archivo, yo.energia)
FCLOSE (archivo)

Hemos abierto (ojo, modo solo lectura), hemos leido los datos EN EL MISMO ORDEN EN EL QUE LO HEMOS GUARDADO (y en variables del mismo tipo) y hemos cerrado.
¡¡¡Datos cargados!!!

Si hay algun problema con la apertura, archivo valdra cero.
Ahora ya todos podeis guardar vuestras partidas en ficheros tan largos como querais. Hay mas formas y funciones, pero eso me lo reservo para otro tutorial que tengo pendiente.

¡No esta mal para ser mi cuarto aporte aqui!

Neodreamer
22/09/2005, 10:08
Muchas gracias xq ademas del esfuerzo lo has hecho muy ordenadito, pero no hacia falta ya q lo habian dejado claro y me habia funcionado haciendolo como tu has dicho ahora y me habian dicho los demas.
1saludo y gracias(toda aportacion es buena)