Anuncios Google

Lectura y Escritura de archivos.

Hola, tengo un problema y es que cuando quiero escribir un archivo o leerlo, me da error, a nil value, y es que no se porque.

Por ejemplo para leer un numero 

file1 = io.open("Juego/UltimoRecord1.lua")
UltimaPuntuacion1 = file1.read("*n")

Me da error.

Tambien, en el juego, cuando quiero que al pulsar start vuelva al menu, se me queda blokeada la PSP. Alguna posible solución??

Saludos.


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 Arkanist

Bieeeen!!!!

Al fin!!,  despues de tanto esfuerzo, despues de tanto pensar, despues de tanto pedir, despues de tanta ayuda recibida... Por Fin lo he solucionado (de momento...).

 Os agradezco a todos la ayuda que me habeis dado, para cualquier cosa aqui me teneis ;).

Ahora podre acabar mi juego a tiempo para el Scenary Beta 2008.

Muchas gracias a todos, Saludos.

Imagen de Arkanist

Ok Gracias.

Gracias por toda la ayuda pero por ahora dejare el tema este de escribir para cuando este mas relajado.

Pero una cosa que no he acabado de solucionar es el comando dofile, que siempre se me queda atascada la psp.

Dentro del bucle, pongo una funcion para que salga una imagen con la ultima puntuacion, y que al pulsar start cargue el menu, pero al pulsar start se me bloquea la psp.

aqui les dejo el codigo: 

function pjmuerte()
if S[1].Salud <= 0 then
screen:clear()
screen:blit(0,0,gameoverI)
screen:fontPrint(letra25,269,168,S[1].Puntuacion,negro)
if pad:start() then
dofile("Juego/Menu.lua")
end
end
end

Imagen de Arkanist

Me pueden ayudar?

Es que estoy un poco desesperado porque este juego no lo he modificado casi desde el dia 13 por culpa de este fallo, que al cargar con dofile el menu se me queda atascada la psp y tengo que mantener pulsado el boton de encender 7 segundos o sacar la bateria. ayuda.

Saludos.

Imagen de P22

Seguro que eso de menu 1.lua

Seguro que eso de menu 1.lua tiene codigo? ,porque cuando cargas un script sin codigo hace eso.

Saludos

Imagen de Arkanist

no, si que tiene.

Lo curioso es que el menu me funciona correctamente, y puedo cargar otros scripts, como los del juego, incluso, al principio de todo te sale el splash ese del scenary beta 2008, y despues carga el menu. Vamos, que el problema creo que es cuando se carga por segunda vez el menu, pero no se.

Imagen de Arkanist

Nadie lo sabe??

O como mínimo de alguna forma de saber donde esta el error.

Es que ya no se que mas hacer.

Imagen de ZYX3D

Pueden ser mil cosas...

Desde un bucle infinito a váyase a saber...

Como sugerencias:

  • No hagas el menú desde un archivo externo, hazlo desde una función definida una vez. Así te evitas ciertos problemas posibles (redefinición de globales "al vuelo", por ejemplo, que pueden causar un bucle infinito, un nil donde no debe, etc.). 
  • Añade un trazado del recorrido del programa a partir del fin del juego, cuando debiera volver al menú principal, y también en el menú.

Si no sabes qué quiero decir con lo de "trazado"... significa, simplemente, que imprimas en pantalla cada paso que des. Así podrás localizar en qué punto se queda colgado el programa. Ojo, que eso no implica que el error esté ahí, pero te servirá para tirar del hilo.


Strength is irrelevant. Resistance is future. We wish to improve ourselves.

La fuerza es irrelevante. La resistencia es futuro. Queremos mejorarnos.

Imagen de Arkanist

A

que te refieres con hazlo desde una funcion definida una vez, que haga una funcion ejemplo Menu() y que la llame cuando necesite ir al menú?

Imagen de ZYX3D

Exacto

Y por "definirla una vez", me refiero a que te asegures que solo aparezca una vez su definición. Si resulta que, por ejemplo, utilizas una función que se define en el archivo que cargas... bueno, probablemente estarías sobreescribiendo una función que se está ejecutando. No sé lo bastante de Lua para saber cómo gestionaría algo así, pero es una de esas cosas que, por lo general, vuelven locos a los programas.

Una manera de asegurarse que la función se define sólo una vez es incluir la definición en un bloque if que se ejecuta si Nombrefuncion es nil. Hay otras...

Pero vaya, que yo de entrada no lo usaría desde un archivo externo, ni que sea para descartar que el error venga de la carga. 


Strength is irrelevant. Resistance is future. We wish to improve ourselves.

La fuerza es irrelevante. La resistencia es futuro. Queremos mejorarnos.

Imagen de Arkanist

ó_ò

Ahora me he perdido y estoy muy confundido en casi todo.

Y lo de poner un bloque if que se ejecuta sinombrefuncion es nil, que quieres deicir es que no lo veo.

Siento poder ser pesado, pero este error me saca de mis casillas desde hace bastante.

Saludos y Gracias.

 

Imagen de ZYX3D

Aclarando...

Veo que ya lo has sacado, y me alegro :)

Sólo para aclarar el punto de la nombrefunción y eso, por si no lo has sacado; es un truqui que te puede servir para el futuro...

No voy muy suelto en Lua, así que siempre tengo que irme mirando la referencia para no hacer "faltas de ortografía"; lo que viene a continuación es pseudocódigo, pero servirá (espero) para entendernos. Creo recordar que el signo de comparación de igualdad (si A es igual a B) es ==... Así, si queremos comprobar si la función "Nombrefuncion" (nombre genérico de la función inventada) está definida, lo que haremos es:

if nombrefuncion==nil then

-y aquí ponemos el código de la función-

end

Así, lo que hacemos es asegurarnos que no define dos veces la función. Es útil cuando no tienes un control completo de cómo se carga todo, o no estás seguro de eso; por ejemplo, si usas una biblioteca/librería de funciones, y hay unas que necesitan otras, y esas necesitan otras más, y así a la náusea... y puede ser que al redefinir la función se fastidie algo. Así te aseguras que lo que tiene que definirse sólo una vez, se define sólo una vez.

El quid de la cuestión es que todo lo que no sea de sistema y no hayas definido te dará nil, mientras que una función ya definida no es nil. Por tanto, si ya has definido la función, el código de dentro del bloque if no se ejecutará. 


Strength is irrelevant. Resistance is future. We wish to improve ourselves.

La fuerza es irrelevante. La resistencia es futuro. Queremos mejorarnos.

Imagen de Arkanist

MMM

Vale, y luego al cargar un script por ejemplo, se le asigna nombrefuncion un numero o cualquier cosa??

Pero en general creo que lo he pillado. Muchas gracias por tu ayuda, podras verte en mis creditos ;)

Imagen de ZYX3D

Más o menos...

La cosa está en que si la función "nombrefuncion" no se ha definido, será nil (todo lo que no se haya definido será un nil).

Pero si ya lo has definido, tipo

nombrefuncion=function...

...

end

entonces no será nil :), por tanto el bloque if no se ejecuta. No tienes que preocuparte por nada más... Lua ya lo reconoce como un "tipo de datos función de usuario".De ahí que puedas ejecutar ese código del bloque if tantas veces como quieras sin que se sobreescriba la función.

También, claro está, puedes hacer una variable que indique si la has definido, pero en principio no es necesario... 

Se agradece lo de los créditos, un saludo :) 

 


Strength is irrelevant. Resistance is future. We wish to improve ourselves.

La fuerza es irrelevante. La resistencia es futuro. Queremos mejorarnos.

Imagen de Arkanist

Entendido.

Vale ya lo he entendido.

Tambien lo de los créditos, es porque cuando era muy novato en lua, y escrivia comentarios en los tutoriales preguntando cosas simples que no entendia, tu y Guillermo_Cornielle me ayudasteis, y las primeras ayudas son quizas las mas útiles ;).

Saludos.

Imagen de pipagerardo

Te recomiendo que uses estas funciones:

function guardar_configuracion()

archivo = io.open("./configuracion.txt", "w+")

archivo:write( jugador[1].nombre )

archivo:write("\n")

archivo:write( new_record )

archivo:write("\n")

archivo:close()

end

 

function leer_configuracion()

archivo = io.open("./configuracion.txt", "r")

if archivo == nill then

guardar_configuracion()

else

jugador[1].nombre = archivo:read()

new_record = archivo:read("*n")

archivo:close()

end

end

Imagen de recoco

Error

Si te hubieras leido el tutorial no te pasaría. No se puede leer scripts lua, solamente cargarlos. Solamente se puede ver y escribir los archivos txt.


Image Hosted by ImageShack.us 

Imagen de Arkanist

OK Gracias. Pero...

Aún hay una cosa que no me funciona. Y es que en el juego (ya sea porque te han matado o cualquier otra cosa) pongo que cuando se pulsa Start, cargue el menú, pero en la PSP cuando pulso start, se me bloquea la PSP y no puedo hacer nada.

Imagen de recoco

Si

Si no te explicas mejor, pon el código.

Imagen de Arkanist

Por ejemplo:

Este es el codigo que tengo para las instrucciones:

function instr()
pad = Controls.read()
screen:clear()
screen:blit(0,0,instrucciones)
if pad:start() then
dofile("Juego/Menu.lua")
end
end

while true do
instr()
screen.waitVblankStart()
    screen.flip()
end

al apretar start, se me bloquea la psp, o por ejemplo

function pjmuerte()
if S[1].Salud < 0 then
S[1].Salud = 0
end
if S[1].Salud == 0 then
screen:clear()
archivo = io.open("Juego/UltimoRecord3.txt","w")
archivo:write(S[1].Puntuacion)
screen:blit(0,0,gameoverI)
screen:print(269,168,S[1].Puntuacion,negro)
if pad:start() then
dofile("Juego/Menu.lua")
end
end
end

aqui tambien se me bloquea la PSP al pulsar start. No me preguntes por que son las otras cosas porque es un poco lioso, tipico de mi.

Espero que alguien pueda ayudarme, aunque igualmente hoy piro y no vuelvo hasta el 25. 

Saludos.

Imagen de recoco

Error

Te falta el pad = Controls.read():

function pjmuerte()
if S[1].Salud < 0 then
S[1].Salud = 0
end
if S[1].Salud == 0 then
screen:clear()
archivo = io.open("Juego/UltimoRecord3.txt","w")
archivo:write(S[1].Puntuacion)
screen:blit(0,0,gameoverI)
screen:print(269,168,S[1].Puntuacion,negro)
if pad:start() then
dofile("Juego/Menu.lua")
end
end
end


Image Hosted by ImageShack.us 

Imagen de Arkanist

No

lo tengo mas arriba, es que es una parte del scritps :S

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.