Funcion guardar y cargar,(Solucion en proceso) (luaDEV)

Buenas, ¿ alguien me puede explicar como funcionan las funciones de savedata.save y savedata.load ? no me ha quedado claro como especifico nombre de archivo y de mas (en negrita)

savedata.save
(table dest, table config, string data)

savedata.load
(table dest, int size)

PD: Gracias de antemano

salu2



-> Creaciones <-

Os invito a probar el lol xD

http://signup.leagueoflegends.com/?ref=50814a20894be236637679

 


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de sisinio

.

Al final me esta empezando a funcionar con el ejemplo de DEV xD muchas gracias a todos por haberme ayudado, que largos seran los creditos de mi HB xDD


-> Creaciones <-

Os invito a probar el lol xD

http://signup.leagueoflegends.com/?ref=50814a20894be236637679

 

Imagen de NauTiluS1

Por favor cambia el titulo ya

Por favor cambia el titulo ya que no tien nada que ver con el relleno el titulo no tiene ninguna pregunta solo es una oración sin sentido alguno incluso invitas a que vean el post a usuarios normales que no tienen que ver con el tema...


Follow me twitter nautilus1_jmccu!!
Sony, ya a nadie le interesa tus UMD si alguien compra una psp es por nosotros los coders. Madura y has un FW que haga la diferencia y anime a las personas en comprar un PSP

Imagen de sisinio

.

Cambiado =)

Explicación

El manejo es bastante sencillo, realmente (tanto, que repetiré mucho de lo que dice la docu xD).

La función savedata.save recibe 3 parámetros:

  • Una tabla, que debe tener dos campos configurados:
    • gameid, el ID del juego, que puede ser cualquier nombre, por ejemplo "el_HB_de_sisinio"
    • savenames. Puede ser una tabla, o un string. Si es un string, sólo podrás guardar un save. Si en cambio, pones una tabla con varios strings, te mostrará una lista con las ranuras disponibles (que dependen de los elementos que tenga la tabla, si pones 5 strings, tendrás 5 ranuras de carga).
      Esto es como en los juegos comerciales, que las ranuras disponibles aparecen en gris, y las ranuras con datos tienen su icono a color.
  • Otra tabla, con más campos preconfigurados (title, subtitle, icon0, etc). Releer la docu, no tengo nada que agregar, más que te sientas en la libertad de jugar con los valores, para que veas el efecto que tienen.
  • Los datos que quieras guardar (en string). Procura recordar cuántos caracteres vas a guardar, ya que la función de cargado por defecto carga 2048 caracteres. Si guardas más, y no lo especificas en la función de cargado, tendrás una carga incompleta.
  • Devuelve 2 parámetros:
    • true o false, dependiendo de si tuvo o no éxito al guardar.
    • un string, con el nombre de la ranura donde se guardaron los datos (útil para hacer después un autoguardado con la función autosave)

Muy sencillo, verdad? La función savedata.load es aún más sencilla, recibe hasta dos parámetros:

  • Una tabla, usar la misma que en la función de guardado. Sólo muestra las ranuras con datos (si tienes 10 ranuras disponibles, pero sólo tienes 2 ocupadas, sólo te mostrará esas dos)
  • Un número, especificando el tamaño de los datos a cargar. Se puede omitir, si piensas usar menos de 2048 caracteres (que es el tamaño por omisión)
  • Regresa 3 parámetros:
    • true o false, de nuevo dependiendo del resultado del cargado
    • un string, indicando la ranura que fue cargada, o nil si hay fallo
    • otro string, con los datos cargados, o nil si hay fallo

Cualquier duda, preguntar ;)

Imagen de dj51_Shura

Eso mismo

aprendí a usar el módulo savedata gracias a ti, Rober (que para algo está google no?), así que nada más que añadir, salvo que, sisino,...

1- Según Rober, DeViaNTe y mi propia experiencia, no uses string.implode, no te servirá con tablas mínimamente complejas

2- Simplemente quédate con que has de guardar un string. Si tienes una tabla, ¿por qué no concatenar sus diferentes elementos?

Te dejo un ejemplo simple, basado en todo lo que ha dicho Rober y lo que me ayudaron sus ejemplos, una preguntita antes en este mismo foro y por supuesto Santo Google (xD):

unction save()
	saveplace = {gameid="id_de_tu_juego", savenames="juego"};
	savelangig_readed = {
		title="Título de tu juego", 
		subtitle="Datos de juego",
		details="Datos de juego para <nombre de tu juego>.",
		icon0="eboot/ICON0.PNG", -- opcional
		pic1="eboot/PIC1.PNG" -- opcional
	};
	-- str : un string que contiene los 10 elementos del savedata, separados by "|@%" (una cadena lista para explotar con 'string.explode')
	str = player.name .. "|@%" .. player.sex .. "|@%" .. player.maxlife .. "|@%" .. player.maxrest .. "|@%" .. player.money .. "|@%" .. player.timeh .. "|@%" .. player.timem .. "|@%" .. menu.options.cpu .. "|@%" .. menu.options.brightness .. "|@%" .. tostring(menu.options.dualload);
	done, where = savedata.autosave(saveplace, savelangig_readed, str); -- 'done' almacena un valor booleano, si se guardó con éxito o no, y 'where' es un string que contiene el nombre del savedata guardado
	if done == true then
		return where;
	else
		return nil;
	end
end
 
function load()
	saveplace = {gameid="id_de_tu_juego", savenames="juego"};
	done, where, what = savedata.autoload(saveplace);
	if done == true then
		data = string.explode(what, "|@%");
		player.name = data[1]
		player.sex = data[2]
		player.maxlife = data[3]
		player.maxrest = data[4]
		player.money = data[5]
		player.timeh = data[6]
		player.timem = data[7]
		menu.options.cpu = tonumber(data[8])
		menu.options.brightness = tonumber(data[9])
		if data[10] == "true" then
			menu.options.dualload = true
		elseif data[10] == "false" then
			menu.options.dualload = false
		end		
		return done;
	else
		return nil;
	end
end

Aplícalo y seguramente te funcione.

Un saludo y suerte

PD: ya te digo que esto lo saqué gracias a la ayuda de Rober y DeViaNTe, es sólo una adaptación *lógica* de lo que ellos me dijeron (o Google :P) para aplicarlo a mis necesidades


http://www.mhypnok.blogspot.com/

Gracias a Dark_AleX, Total_Noob, VirtuousFlame, Coldbird, Codestation...

Imagen de sisinio

.

Siempre me da el mismo error en esta parte Socorro !!!! ya no puedo mas:

if controls.start() and mActual == 1 then
savedata.save()
end

PD: Muchas gracias a todos de verdad me habeis ayudado muchismo =) pero el dichoso error U.U


-> Creaciones <-

Os invito a probar el lol xD

http://signup.leagueoflegends.com/?ref=50814a20894be236637679

 

._.?

Que pasó con los parámetros de la función? Si no se los pones, obvio que dará error xD

Imagen de sisinio

los he puesto y pasa lo mismo

los he puesto y pasa lo mismo U.U no se que hacer ya xDD

Venga

Pega tu code, algo incorrecto debes tener (porque de que furula, furula de alguna manera xD)

Imagen de sisinio

.

te doy 50 scenebitos xDD solo quiero que me guarde partida al pulsar start (lo de cargar para mas adelante xDD)

http://www.mediafire.com/download.php?gjhk510oqle2z2n

PD: Aun soy un poco noob en programacion U.U


-> Creaciones <-

Os invito a probar el lol xD

http://signup.leagueoflegends.com/?ref=50814a20894be236637679

 

Dos cosillas

  • Línea 44: Veo que usas player.name, player.sex... supongo que habrás definido en otro script la tabla player (si no, error xD)
  • Línea 110: Hiciste una función para guardar todo, muy bien. Lo que está mal, es que llames a savadata.save() en lugar de llamar save() (que es como se llama la función de guardado que declaraste)

EDITO: Muy cierto lo que menciona Barney sobre las imágenes.

Imagen de sisinio

.

Estoy perdido xD cuanta paciencia hay que tener... mañana me lo mirare con mas calma a ver que tal me va xDD

EDITADO: vale ya solo me falta el string que es donde me salta error ahora xDD
¿tengo que hacer una tabla en otro script con los detelles del jugador ?


-> Creaciones <-

Os invito a probar el lol xD

http://signup.leagueoflegends.com/?ref=50814a20894be236637679

 

Tal y como dejaste el code,

Tal y como dejaste el code, si (o definirla en otro lado del code, da lo mismo). Por supuesto, también puedes usar variables "sueltas" y concatenarlas al usar la función de guardado, es lo mismo.

La mejor recomendación que puedo darte es que no uses codes que te hayan dejado, guíate con ellos, pero no los uses tal cual. Cada quién programa diferente, y si usas tal cual otro code que no entiendes como funciona lo único que lograrás es confundirte ;)

Imagen de sisinio

.

Porfavor me podrias corregir tal cual esta ahora: (error linea 55 attempt to index field options (a nil value))

guerrero_sabion = {}
guerrero_sabion["stay"]={}
guerrero_sabion["walk"]={}
 
str = {
		player_name="guerrero", 
		player_sex="male",
		player_maxlife="100",
		player_maxrest="100",
		player_money="0",
		player_timeh="0",
		player_timem="0",
		menu_options_cpu="100",
		menu_options_brightness="100",
	}; 
 
	guerrero_sabion["stay"]["up"] = image.load("Imagenes/Sprites/guerrero sabion arriba.png")
guerrero_sabion["stay"]["down"] = image.load("Imagenes/Sprites/guerrero sabion abajo.png")
guerrero_sabion["stay"]["right"] = image.load("Imagenes/Sprites/guerrero sabion derecha.png")
guerrero_sabion["stay"]["left"] = image.load("Imagenes/Sprites/guerrero sabion izquierda.png")
suelo = image.load("Imagenes/suelo.png")
arbol = image.load("Imagenes/Sprites/arbol.png")
 
 
black=color.new(0,0,0)
 
menu = {}
menu[1] = image.load("Imagenes/submenu1.png")
menu[2] = image.load("Imagenes/submenu2.png")
 
 
options = 2
mActual = 1
 
rawset(guerrero_sabion["walk"],"up",image.loadsprite("Imagenes/Sprites/arribam.png",32,48))
rawset(guerrero_sabion["walk"],"down",image.loadsprite("Imagenes/Sprites/abajom.png",32,48))
rawset(guerrero_sabion["walk"],"right",image.loadsprite("Imagenes/Sprites/derecham.png",32,48))
rawset(guerrero_sabion["walk"],"left",image.loadsprite("Imagenes/Sprites/izquierdam.png",32,48))
 
status = "stay" 
direction = "down" 
x = 25 
y = 91 
anim = 0 
 
function save()
	saveplace = {gameid="Sabion", savenames="juego"};
	savelangig_readed = {
		title="Sabion", 
		subtitle="Datos de juego",
		details="Datos de juego para Sabion.",
		icon0="EBOOT.PBP/ICON0.PNG", 
	};
 
	str = player_name .. "|@%" .. player_sex .. "|@%" .. player_maxlife .. "|@%" .. player_maxrest .. "|@%" .. player_money .. "|@%" .. player_timeh .. "|@%" .. player_timem .. "|@%" .. menu.options_cpu .. "|@%" .. menu.options_brightness .. "|@%" .. tostring(menu.options.dualload);
	done, where = savedata.autosave(saveplace, savelangig_readed, str);
	if done == true then
		return where;
	else
		return nil;
	end
end
 
while true do
	controls.read()
	image.blit(0,0,suelo)
	image.blit(250,96,arbol)
	image.blit(65,111,arbol)
	image.blit(0,0,menu[mActual])
 
 
 
	if controls.press("l") then
    if mActual<=1 then mActual=2 else mActual = mActual - 1 end
elseif controls.press("r") then
    if mActual >=2 then mActual = 1 else mActual = mActual + 1 end
end
 
	if controls.up() or controls.down() or controls.left() or controls.right() then
		anim = anim + 0.1
		status = "walk"
		if math.floor(anim)>3 then
			anim = 0
		end
	else
		anim = 0
		status = "stay"
	end
 
	if controls.up() then
		y=y-1
		direction = "up"
	elseif controls.down() then
		y=y+1
		direction = "down"
	elseif controls.right() then
		x=x+1
		direction = "right"
	elseif controls.left() then
		x=x-1
		direction = "left"
	end
 
	if status=="walk" then
		guerrero_sabion[status][direction]:setframe(anim)
	end
 
	if x<0 then
	x=0
	elseif x+32>480 then
	x=480-32
end
 
if y<0 then
	y=0
	elseif y+48>272 then
	y=272-48
end
	guerrero_sabion[status][direction]:blit(x,y)
	screen.flip()
 
if controls.start() and mActual == 1 then
save()
end
if controls.start() and mActual == 2 then
dofile("script menu.lua")
end
end


-> Creaciones <-

Os invito a probar el lol xD

http://signup.leagueoflegends.com/?ref=50814a20894be236637679

 

Línea 55

Veo que intentas concatenar player_name, player_sex... No es correcto hacerlo de esa manera, porque esas variables están definidas dentro de una tabla (str en tu caso), por lo tanto, deben ser llamadas como elementos de esa tabla: str.player_name; o bien: str["player_name"] (es lo mismo, usa la que te parezca más cómoda)

Imagen de barney77

Venga, para algo shura te

Venga, para algo shura te dejo comentarios junto al code, mira bien:

function save()
	saveplace = {gameid="id_de_tu_juego", savenames="juego"};
	savelangig_readed = {
		title="Título de tu juego", 
		subtitle="Datos de juego",
		details="Datos de juego para <nombre de tu juego>.",
		icon0="eboot/ICON0.PNG", -- opcional
		pic1="eboot/PIC1.PNG" -- opcional
	};
	-- str : un string que contiene los 10 elementos del savedata, separados by "|@%" (una cadena lista para explotar con 'string.explode')
	str = player.name .. "|@%" .. player.sex .. "|@%" .. player.maxlife .. "|@%" .. player.maxrest .. "|@%" .. player.money .. "|@%" .. player.timeh .. "|@%" .. player.timem .. "|@%" .. menu.options.cpu .. "|@%" .. menu.options.brightness .. "|@%" .. tostring(menu.options.dualload);
	done, where = savedata.autosave(saveplace, savelangig_readed, str); -- 'done' almacena un valor booleano, si se guardó con éxito o no, y 'where' es un string que contiene el nombre del savedata guardado
	if done == true then
		return where;
	else
		return nil;
	end
end

Tienes que poner los datos tú, es obvio que te dara error, está buscando un Icono y un Ebot inexsistente, o no?

Imagen de sisinio

.

puff xDD

estoy probando con el ejemplo para ver simplemente si funciona y me da error mira pongo esto (solo estoy probando, luego lo cambiare)

function save()
        mydata = {
                "nick='LuaDEV'",
                "age=69",
                "watermark='Ouch'",
                "anydata='foo'",
                "foo='bar'"
        };
 
        mysavedata = mydata:implode("[SEPARATOR_FOR_SEPARE_DATA_XD]");
 
        spaces = { "DATA0", "DATA1", "DATA2" };
        saveplace = {gameid="DEMODEV", savenames=spaces};
        saveconfig = { 
                title="Sample save of example", 
                subtitle=os.date(), 
                details="Some data saved",
                savetext="New stuff!"
        }
 
        done, where = savedata.save(saveplace,saveconfig,mysavedata);
        if done then return where 
        else return nil end
end

 

y luego pongo:

if controls.start() and mActual == 1 then
savedata.save(saveplace,saveconfig,mysavedata)
end

y error U.U y eso que se trata del ejemplo xDD no lo entiendo porque salta error ?

PD: error "bad argument #1 to save (table expected, got nil)


-> Creaciones <-

Os invito a probar el lol xD

http://signup.leagueoflegends.com/?ref=50814a20894be236637679

 

Imagen de dj51_Shura

¿Por qué haces copy&paste?

Los ejemplos pueden tener algún error. Primero has de saber qué hace la función. Sin eso... bien vamos...

Después, nunca copy&paste. ¿Qué aprendes de esta manera? Yo te dejé un code que usaba referencias a tablas de un juego que estoy haciendo. Es obvio que si tú no tienes dichas tablas,... >.<

Empecemos de nuevo. Imagina que tienes una tabla. Esa tabla se llama 'jugador', y contiene dos elementos: el nombre y el sexo. Ambos son del tipo string. savedata.save recibe tres parámetros:

  • saveplace:

Una tabla con el elemento gameid y savenames. El primero sería, por ejemplo, "LDEV", "ULES", "UCES", etc... vamos, lo típico. El segundo varía, dependiendo de si usas savedata.save o savedata.autosave. En el primer caso puede ser un solo string o una tabla, con las ranuras de guardado... ¿qué es una ranura de guardado? Pues hay juegos (por ejemplo... aver... invizimals...) que puedes guardar varios savedatas, y cargar el que te plazca. Hay otros (MHFU) que aunque puedes tener varios personajes, sólo tienes un savedata. No me explayaré más.

  • saveconfig:

Esto está más que explicado en la docu, es una tabla con varios elementos de nombre predefinido. Creo que también lo has comprendido, así que yasta.

  • data:

Los datos a guardar. NO ES UNA TABLA. NO PUEDE SER UNA TABLA! Este parámetro OBLIGATORIAMENTE HA DE SER UN STRING, por lo que pasarle una tabla, o una tabla:implode(...) dará error o no te servirá. HAS DE CONCATENAR TÚ MISMO LOS ELEMENTOS DE LA TABLA QUE QUIERAS GUARDAR. ¿Cómo?

ranuras_de_guardado = {
  "0001",
  "0002",
  "0003",
  "0004",
  "0005"
};
saveplace = {gameid="LDEV", savenames=ranuras_de_guardado};
	done, where, what = savedata.load(saveplace);
	if done == true then
		data = string.explode(what, "$%&");
		jugador.name = data[1]
		jugador.sex = data[2]
		return done;
	else
		return nil;
	end
ranuras_de_guardado = {
  "0001",
  "0002",
  "0003",
  "0004",
  "0005",
};
saveplace = { gameid = "LDEV", savenames = ranuras_de_guardado }
 
jugador = { }
jugador.name = "Nombre del jugador"
jugador.sex = "Sexo" -- no pongo nada por no ofender a nadie... xD
 
sep = "$%&" -- este es el separador que usaremos para separar los datos concatenados
data = jugador.name .. sep .. jugador.sex
 
savedata.save(saveplace, saveconfig, data);

Ahora cargar datos. Es muy fácil, ya lo verás: (comento en el code)

NO COPIES CÓDIGO. FÍJATE EN LOS EJEMPLOS. ENTIÉNDELO. DEBES SABER LO QUE HACE ANTES DE USARLO. NO PUEDES PRETENDER QUE YO TE DE UN CÓDIGO CON LAS VARIABLES DE TU HOMEBREW, ESO ES TAREA TUYA. SOLO LEE, COMPRENDE Y ADAPTA.


http://www.mhypnok.blogspot.com/

Gracias a Dark_AleX, Total_Noob, VirtuousFlame, Coldbird, Codestation...

Pues si, tienes los

Pues si, tienes los parámetros que intentas darle a savedata.save declarados dentro de una función que nunca llamaste, por eso te advierte que valen nil. Se soluciona sencillo: saca saveplace, saveconfig y mysavedata de la función, y debería irte bien.

Imagen de sisinio

.

Sigo sin conseguir nada xDD error error y mas error te puedo pasar el script y me lo revisas ??

Si

Pensé q postearías de nuevo el code, por eso no respondí xD

En la documentación viene un

En la documentación viene un ejemplo muy bueno (si ya lo leíste y no lo entiendes, puedo explicarte detalladamente, pero me interesa que primero leas la docu)

Imagen de sisinio

.

ya he consultado el ejemplo... sin embargo prefiero que mo explique si no es mucha molestia prefiero entenderlo al 100% antes que el 50%


-> Creaciones <-

Os invito a probar el lol xD

http://signup.leagueoflegends.com/?ref=50814a20894be236637679

 

Imagen de NEKERAFA

Mmm...

En la documentación que tengo no sale eso... haber si miro una más reciente

Yo tengo ésta, ahi puedes

Yo tengo ésta, ahi puedes cosultarlo ;)

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.