Guardado de partidas en homebrew

Wenas!

No sabía bien que titulo ponerle al post xD.
Estoy haciendo un juego para la NDS y ahora estoy haciendo el guardado de las partidas. Para que el código fuera mas mono, lo hice todo con clases en C++, el "problema" es que ahora para guardar las partidas (un máximo de 4), tengo un objeto de la clase Partida, donde se guarda toda la información de la partida actual, y toda la información la quiero guardar en un fichero binario (un fichero de save), como tengo que pasar la informción a un fichero binario, creé un struct con la información necesaria.
El problema de éste método es que gasto espacio con la instancia de la clase y con el struct auxiliar que uso para hacer la escritura en el fichero, creo que es poco eficiente, pero ahora no se me ocurre qué hacer mejor.

Había pensado en hacer un fwrite(&buffer, sizeof(partida), MAX_PARTIDA, f); donde partida es una clase, pero eso no va xDD
También había pensado en cargarme la clase partida y guardar la información directamente en struct aunque sea un poco menos elegante.

Vosotros cómo implementáis el guardado de partidas, clases, struct.. :-?

Perdonad por el tocho XD

Un saludo!
Te lo reporto para que te lo muevan a "Desarrollo" [risita]
O vas grabando cada valor uno a uno... o struct, que es lo más cómodo.
¿Por que no pruebas lo siguiente? Creo que además es una solución limpia y simple:

En tu clase "Partida" o como se llame la clase que estés usando que contiene los datos del juego que quieres salvar haces lo siguiente:
  • Declaras la clase como un singleton, puesto que solo vas a tener una partida, no tiene sentido tener más instancias de esta clase en la memoria.
  • En los atributos de la clase metes una estructura con todos los datos que te interese salvar
  • Añades una pareja de métodos estáticos (métodos de clase) para grabar y cargar partidas que graben o carguen de fichero dicha estructura y dentro de los métodos ya lo gestionas como tu veas, mediante fwrite o la funcion que corresponda.

Conclusión: Haces que tu clase sea util, protegiendote de cosas como que puedas tener una partida anterior que te haya podido quedar por memoria y de repente se reemplacen datos o alguna cosa rara y luego que desde cualquier parte del codigo mediante los metodos estaticos podras grabar y cargar partidas con solo tener un puntero a la instancia unica de la clase Partida, ahorrandote un cojon de codigo y sobre todo muuucha mierda que te pueda salir de hacer copia y pega.

Saludos!
No me había empanado de que habia un subforo de desarrollo, a partir de ahora postearé ahí estas dudas xDD

3r Ch4mp1 escribió:¿Por que no pruebas lo siguiente? Creo que además es una solución limpia y simple:

En tu clase "Partida" o como se llame la clase que estés usando que contiene los datos del juego que quieres salvar haces lo siguiente:
  • Declaras la clase como un singleton, puesto que solo vas a tener una partida, no tiene sentido tener más instancias de esta clase en la memoria.
  • En los atributos de la clase metes una estructura con todos los datos que te interese salvar
  • Añades una pareja de métodos estáticos (métodos de clase) para grabar y cargar partidas que graben o carguen de fichero dicha estructura y dentro de los métodos ya lo gestionas como tu veas, mediante fwrite o la funcion que corresponda.

Conclusión: Haces que tu clase sea util, protegiendote de cosas como que puedas tener una partida anterior que te haya podido quedar por memoria y de repente se reemplacen datos o alguna cosa rara y luego que desde cualquier parte del codigo mediante los metodos estaticos podras grabar y cargar partidas con solo tener un puntero a la instancia unica de la clase Partida, ahorrandote un cojon de codigo y sobre todo muuucha mierda que te pueda salir de hacer copia y pega.

Saludos!


Algo parecido tengo, sólo creo una instancia de la clase partida. Miraré de estructurar mejor el código porque las funciones de cargar/guardar partidas estan en otra clase XDD

Thanks!
boost::serialization es tu amiga :)
ffelagund escribió:boost::serialization es tu amiga :)

Boost funcionaria en la DS? Deberia ser asi porque se supone que son librerias que pronto entrarán al estándar de c++ pero en cacharrejos de estos... La unica consola donde estoy seguro que funciona Boost es en PS3 porque los de Insomniac hablaron en su wiki que ellos la habian usado.
boost es C++. Solo tienes que recompilarla en la plataforma debida. Yo la estoy usando en PSP y iPhone. La ventaja es que al ser modular, metes lo que quieres: que si smart pointers, que si colecciones, que si serializacion...
Y yo que creia que boost no funcionaba en la psp y tal...la probaré porque es una herramiente de puta madre. Por cierto, ¿alguna particularidad o truco que haya que hacer para compilarla para PSP?

Saludos!
3r Ch4mp1 escribió:Y yo que creia que boost no funcionaba en la psp y tal...la probaré porque es una herramiente de puta madre. Por cierto, ¿alguna particularidad o truco que haya que hacer para compilarla para PSP?

Saludos!

Compilar boost siempre se las trae. si tienes problemas agregame a gtalk (mi nick@gtalk.com) y te echo una mano, aunque te aviso que yo no use el toolchain de ps2dev, pero por lo que recuerdo no es muy diferente en ese aspecto.
Primero, no se te ocurra grabar la clase entera como si fuera una estructura. Las clases en C++ tienen listas, vectores, punteros etc que no se pueden grabar de un golpe. Lo mejor que puedes hacer sin complicarte es crear funciones en la partida y en cada objeto que la compone que sean: GrabarFichero() y CargarFichero(). Como fichero puedes usar un FILE* o un std::stream, lo que mejor se te de. La librería Boost es potente, pero también muy compleja.

Imagina que tienes un juego de aviones y CPartida es una clase que tiene: lista de enemigos, nivel del juego, puntos, nivel de vida y lista de disparos. Cada objeto sabe cómo grabarse (hay que implementarlo), de esta manera es sencillo y elegante. Para grabarlo sería así:

// asumimos que f está abierto para escribir
CPartida::GrabarFichero(FILE *f)
{
   fwrite(&nivel, sizeof(nivel), 1, f);
   fwrite(&vida, sizeof(vida), 1, f);
   fwrite(&puntos, sizeof(puntos), 1, f);
   lista_enemigos.GrabarFichero(f);
   lista_disparos.GrabarFichero(f);
}
10 respuestas