Veran, quiero hacer un juego en el cual la gracia es que al estilo de Dark Souls se guarde en todo momento para impedir que el jugador cargue a un momento previo.
Para ello, normalmente podía hacer eso con game_save, pero ultimamente esta buggeado haciendo que al cargar surjan errores fatales.
Una alternativa que me dieron es usar algo denominado ficheros JSON.
Para eso parece que necesito funciones tipo ds_map, pero no entiendo bien como funciona todo.
¿Alguien puede explicarme como iria?

#1 Julio 14, 2019, 05:38:38 PM Ultima modificación: Julio 14, 2019, 05:48:29 PM por Silver_light
Los archivos JSON (javascript Object Notation) son archivos ligeros que se utilizan para el intercambio de datos, los cuales, por su estructura son fáciles de leer tanto para las personas como para las aplicaciones.
    Están construidas con dos estructuras basicas:


  • Una coleccion de pares del tipo nombre/valor. Lo que en Game Maker se conoce como un ds_map
(He aquí la razón de por qué te dijeron que uses JSON's con ds_maps)
  • Una lista ordenada de valores, conocidas en Game Maker como ds_list

Game Maker studio 2 cuenta con una funcion específica llamada json_decode(). Con esta funcion puedes decodificar una pieza de JSON y convertirla en un ds_map, para trabajarla entonces con Game Maker.

Como dato adicional, el fichero JSON es un archivo que es independiente del lenguaje, y se usa para modelar un objeto.
No sé si hayas trabajado antes con lenguajes "puros", si así puede decirseles, como C++/C/Java/Python/etc etecé XD
Pero mmm podrías tener algo como:
[gml]
objeto fantasma
solido = false
visible = true
[gml]
Que vendría a modelizar muy por encima un objeto de Game Maker. Entonces si quisiéramos por alguna razón hacer un JSON escribiríamos:


{
      "nombre": "fantasma",
      "solido": false,
      "visible": true
}

Nótese que lo que vendría siendo el nombre de las variables vá entre comilla, sustituiríamos el signo de igual = por los dos puntos : y que se separan con comas ,
También se pueden poner valores como array dentro de un JSON, e incluso otro JSON como campo de éste.(o que es lo mismo, un JSON dentro de una "variable").

No sé cuál es la máxima utilidad de tu Game_save(), pero yo a efectos prácticos usaría un text file, guardando por linea cada dato útil. Luego simplemente los recuperaría ciclicamente.

Saludos! :)

edit:
XD me olvidé de dejar la página maestra donde explica todo, en spanish, detallado:
https://json.org/json-es.html

#2 Julio 15, 2019, 10:30:18 AM Ultima modificación: Julio 15, 2019, 12:48:11 PM por Marth
La parte del text_file si que la he encontrado util. Bastante fácil de usar, por lo que servira para variables sencillas, aunque para objetos complejos supongo que debo aprender lo de ds_map y esas cosas.
Aunque mi idea es que tengo diversos objetos con diferentes variables (posiciones X e Y, PS, Experiencia, etc), por lo que la idea es que el sistema de guardado coja un objeto y guarde absolutamente todas sus estadisticas. La ventaja de game_save es que al guardar todo, puedes luego volver a justo como estaba todo en el momento de guardar, como si usase una máquina del tiempo.

#3 Julio 16, 2019, 06:37:56 PM Ultima modificación: Julio 16, 2019, 06:40:37 PM por Silver_light
Si y No, todo dependerá de cómo quieras apañartelas.En lenguajes como C, esas cosas no existen.

La idea en general como todos los archivos, es definir estructuralmente cómo uno va a guardar los valores, si lo haría en pares, si lo dividiría en secciones o en este caso concreto usaría la notación de JSON para armar un archivo.

Entonces no es estriiiiiictamente necesario usar ds_map functions, sino más bien guardar los valores respetando el estándar, si así se quiere, de JSON.
Sería conveniente usar ds_map si y solo sí se trataran de variables puras y duras  XD quiero decir, valores que a lo mejor no pertenecen a ninguna instancia concreta, sino más bien hablando de datos abstractos. Entonces si sería conveniente,  en primer lugar crear un mapa y llenarlo. Sería como la estructura sobre la que se rigen los datos que están por ahí volando.
Peeero en el caso de tratarse de objetos, no veo razón para hacerlo así. Podrías armar un script que directamente tomase la instancia abstracta y sacara en un fichero todos los datos comunes.
Luego simplemente lo abrirías de nuevo (o simplemente no lo cierras) de manera tal que los datos se escribiesen al final de la última modificación.

Entonces los objetos se escribirían uno debajo de otro.