Anuncios Google

[Solucionado] error:attempt to index local en LUA

Hola, probando un homebrew que estoy realizando en LUA, me marca un error (attempt to index local 'archivo2' ( a nil value) ) en la siguiente funcion. La línea que me marca esta comentada en el código mediante asteriscos. Gracias de antemano.

function Terminar(fondo,img,pestanhas,jugador,oponente,torneo,partida,historial,cambiar_pantalla,turno,colores,pos_jug,pos_opo,idioma)
-- Permite ver el historial de batalla y guardar el historial en un archivo de texto o volver al menú principal
local oldpad = Controls.read()
local color1,color2,color3 = colores[1],colores[2],colores[3]
local max_opciones_historial = #historial
local opcion_historial = max_opciones_historial
local opcion_elegida
local sonido = Sound.load('./Sonidos/hoja.wav',false)
local mostrar_controles = 0
local continua_ronda
local n = 125
local pantalla_controles = Image.createEmpty(480,272)
pantalla_controles:clear(Color.new(0,0,0,n))
 
    while true do
        InicioPantalla(fondo,img,pestanhas,cambiar_pantalla,turno,colores,idioma.turno)
 
        screen:print(pos_opo.nombre[1],pos_opo.nombre[2],oponente.nombre,color1) -- Imprime el nombre del oponente
        screen:blit(pos_opo.avatar[1],pos_opo.avatar[2],oponente.avatar) -- Muestra el avatar del oponente
        screen:print(pos_opo.vidas[1],pos_opo.vidas[2],oponente.vidas,color1) -- Imprime las vidas del oponente
        screen:print(pos_jug.nombre[1],pos_jug.nombre[2],jugador.nombre,color1) -- Imprime el nombre del jugador
        screen:blit(pos_jug.avatar[1],pos_jug.avatar[2],jugador.avatar) -- Muestra el avatar del jugador
        screen:print(pos_jug.vidas[1],pos_jug.vidas[2],jugador.vidas,color1) -- Imprime las vidas del jugador
 
        screen:print(150,40,idioma.historial_batalla,color2) -- Imprime ' Historial de batalla'
 
        if mostrar_controles == 1 then -- Imprime la ayuda de controles
            screen:blit(0,0,pantalla_controles)
            screen:print(40,50,'/: '..idioma.triangulo,color2)
            screen:print(40,70,'[]: '..idioma.cuadrado,color2)
            screen:print(40,90,'O: '..idioma.circulo,color2)
        end
 
        screen:drawLine(150,80,450,80,color1) -- Dibuja una línea horizontal
        screen:drawLine(250,60,250,200,color1) -- Dibuja una línea vertical
        screen:drawLine(360,60,360,200,color1) -- Dibuja una línea vertical
        screen:drawLine(370,60,370,200,color1) -- Dibuja una línea vertical
        screen:print(380,70,idioma.turno,color1) -- Imprime 'Turno'
        screen:print(170,70,jugador.nombre,color1) -- Imprime el nombre del jugador
        screen:print(270,70,oponente.nombre,color1) -- Imprime el nombre del oponente
        screen:print(90,230,idioma.ver..': '..opcion_historial,color1) -- Imprime la opción a ver
 
        if max_opciones_historial > 5 then -- Imprime las 6 últimas modificaciones de vidas de los jugadores
            z = 1
            for i = opcion_historial-5 , opcion_historial do
                for j = 1 , 2 do
                    screen:print(180+50*j,70+20*z,historial[i][j],color2)
                end
                screen:print(390,70+20*z,historial[i][3],color2)
                z = z + 1
            end
 
        elseif    max_opciones_historial <= 5 then
            for i = 1 , max_opciones_historial do
                for j = 1 , 2 do
                    screen:print(180+50*j,70+20*i,historial[i][j],color2)
                end
                screen:print(390,70+20*i,historial[i][3],color2)
            end
        end
 
        -- ! Pad
        if pad:up() and oldpad:up() ~= pad:up() and opcion_historial > 6 then
            opcion_historial = opcion_historial - 1
            snd.cambiar_opcion2:play()
        end
        if pad:down() and oldpad:down() ~= pad:down() and opcion_historial < max_opciones_historial then
            opcion_historial = opcion_historial +1
            snd.cambiar_opcion2:play()
        end
        if pad:triangle() and oldpad:triangle() ~= pad:triangle() then -- Guarda el historial y termina la ronda
            if torneo.nombre ~= 'Casual' then
                local archivo2 = io.open('tournament.ini','w')
                archivo2:write(torneo.nombre..'\n') -- ########### Aquí es donde me marca el error ##################
                archivo2:write(jugador.nombre..'\n')
                archivo2:write(torneo.total_rondas..'\n')
                archivo2:write(partida.ronda..'\n')
                archivo2:close()
            end
 
            GuardarHistorial(jugador.nombre,oponente.nombre,torneo.nombre,partida,historial)
                local archivo = io.open(torneo.nombre..'.txt','a')
                archivo:write('\n')
                archivo:close()
                continua_ronda = 0
 
            break
        end
        if pad:square() and oldpad:square() ~= pad:square() then -- Guarda el historial y continúa la tonda
            GuardarHistorial(jugador.nombre,oponente.nombre,torneo.nombre,partida,historial)
            continua_ronda = 1
            partida.juego = partida.juego + 1
            sonido:play()
            break
        end
        if pad:circle() and oldpad:circle() ~= pad:circle() then -- Vuelve al menú principal
            continua_ronda = 0
            break
        end
        if pad:select() and oldpad:select() ~= pad:select() then -- Activa/desactiva la ayuda de controles
            if mostrar_controles == 0 then mostrar_controles = 1 else mostrar_controles = 0 end
        end
 
        oldpad = pad
        screen.waitVblankStart()
        screen.flip()
    end
 
return continua_ronda,partida.juego,partida.ronda end



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 KuRiN-GaMeR

Ya he solucionado el

Ya he solucionado el problema.
En una función que se realizaba anterior a esta, comprobaba si el archivo (que pretendía modificar en esta función) existía mediante la función System.doesFileExist("ruta archivo"). La he quitado, y se ha resuelto el problema. No sé si es que hay otra parte de código que le afecta al archivo o es bug.


Imagen de KuRiN-GaMeR

@xerpi: Los dos puntos (..)

@xerpi: Los dos puntos (..) son los de concatenacion, así que no se podrían eliminar, si se hace resulta error. Gracias de todas formas.

Aun sigo sin solucionar el problema...


eque en lua dev si hay una

eque en lua dev si hay una sola variable, por ejemplo screen.print(10,10,variable), si lo pones as iscreen.print(10,10..,variable..)

marca error, por eso lo decia igualmente ya me pensaba que no era eso pero para intentar no pierdes nada :)

mmm no se lo unico que se me

mmm no se lo unico que se me ocurre es que pruebalo quitando los dos .. en vez de asi: archivo2:write(torneo.nombre..'\n')
asi:archivo2:write(torneo.nombre'\n') con este y los de abajo y nos dicen que tal

Imagen de Halcon_31

LuaPlayer

Podrias decir LuaPlayer?, alomejor soy yo que toy cegato ,pero no veo la linea dnde esta el error(tu comentas que esta marcada con #)

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.