Remove limit to life module

Hi, sorry for my google english. I am working with the Sticker-Knight-Platformer life module, the life limit is set to 5. Is there a way to remove the limit and add more lives? I have tried in many ways but I can’t, I can add lives but not the image. My intention to start the game with 5 lives but no limit.
I hope I have explained myself.

regards

-- Define module
local M = {}

function M.new( options )
	-- Opciones predeterminadas, por ejemplo:
	options = options or {}
	local image = options.image
	local max = options.max or 5--Cantidad máxima de vidas
	local spacing = options.spacing or 30 --Separación entre vidas
	local w, h = options.width or 64, options.height or 64 --Tamaño png de las vidas
	-- Crear grupo de visualización para mostrar imágenes
	      grupovidas = display.newGroup()
	local hearts = {}
	for i = 1, max do
		hearts[i] = display.newImageRect( "scene/game/img/shield.png", w, h )
		hearts[i].x = (i-1) * ( (w/2) + spacing )
		hearts[i].y = 0
		grupovidas:insert( hearts[i] )
	end

	grupovidas.count = max

	function grupovidas:damage( amount )
		grupovidas.count = math.min( math.max( 0, grupovidas.count - ( amount or 1 ) ) )
		for i = 1, max do
			if i <= grupovidas.count then
				hearts[i].alpha = 1
			else
				hearts[i].alpha = 0.2
			end
		end
		return grupovidas.count
	end

	function grupovidas:heal( amount )
		self:damage( -( amount or 1 ) )
	end

	function grupovidas:finalize()
		-- eliminación de los objetos del grupo, instancia de limpieza 
	end
	grupovidas:addEventListener( "finalize" )
	-- Return instance
	return grupovidas
end

return M

Si haces local max = options.max or 7--Cantidad máxima de vidas, debería funcionar, a menos que dentro de options ya este especificado el numero máximo de vidas.

Hola depilz, gracias por contestar. El límite de vidas ya está fijado en 5, con options.max or 7 lo que haría es fijar el máximo de vidas en 7. Lo que intento es quitar “max” como valor máximo y empezar el juego con 5 vidas pero sin límites.

Aah! dale, ahora entiendo. Ya que los datos de contrucción pueden cambiar, necesitas guardarlos para poder crear más corazones a futuro.

    local grupovidas = display.newGroup()
    grupovidas._buildData = {
        image   = options.image,
        max     = options.max     or 5,  -- Cantidad máxima de vidas
        spacing = options.spacing or 30, -- Separación entre vidas
        width   = options.width   or 64, -- Tamaño png de las vidas
        height  = options.height  or 64
    }

Luego, cuando recibas daño, necesitas asegurarte que tienes tantos corazones dibujados cuanto vidas


function grupovidas:damage( amount )
    grupovidas.count = math.max( 0, grupovidas.count - ( amount or 1 ) ) 

    -- numChldren representa el numero de corazones que hemos creado hasta el momento
    -- Dibujamos nuevos corazones solo si el numero de vidas es mayor al numero de corazones ya dibujados
    for i = grupovidas.numChildren, grupovidas.count do
        hearts[i] = display.newImageRect( grupovidas, "scene/game/img/shield.png", grupovidas._buildData.width, grupovidas._buildData.height )
        hearts[i].x = (i-1) * ( (grupovidas._buildData.width/2) + grupovidas._buildData.spacing )
    end

   --- El código continua...

Y por último, iteramos sobre todos los corazones para mostrarlos correctamente (aún dentro de la función damage).

    for i = 1, grupovidas.numChildren do -- Iterera sobre todos los corazones, por debajo y por encima del valor de vida actual
        if i <= grupovidas.count then
            hearts[i].alpha = 1
        else
            hearts[i].alpha = 0.2
        end
    end
1 Like

Hola de nuevo depilz, he adaptado tu código a mi script, no lo he hecho exactamente como tú porque me daba errores con las variables dentro de la tabla:
grupovidas._buildData = {

Lo he adaptado a mi manera, me inserta las vidas correctamente ( tanto en las imágenes como en la tabla), pero me da un error de valor nulo en la línea 35: attempt to index field ‘?’ (a nil value)
esta es la línea 35: hearts[i].alpha = 0.2

Si elimino dicha línea, todo va bien pero, ya no se le aplica el alpha a las imágenes de las vidas que el enemigo va restando:

Este es mi script completo:

-- Define module
local M = {}

function M.new( options )
	-- Opciones predeterminadas, por ejemplo:
	options = options or {}
	local image = options.image
	local max = options.max or 5--Cantidad máxima de vidas
	local spacing = options.spacing or 30 --Separación entre vidas
	local w, h = options.width or 64, options.height or 64 --Tamaño png de las vidas
	-- Crear grupo de visualización para mostrar imágenes
	local grupovidas = display.newGroup()
	local hearts = {}
	for i = 1, max do
		hearts[i] = display.newImageRect( "scene/game/img/shield.png", w, h )
		hearts[i].x = (i-1) * ( (w/2) + spacing )
		hearts[i].y = 0
		grupovidas:insert( hearts[i] )
	end

	grupovidas.count = max

	function grupovidas:damage( amount )
		grupovidas.count = math.max( 0, grupovidas.count - ( amount or 1 ) ) 
		
    for i = grupovidas.numChildren, grupovidas.count do
		hearts[i] = display.newImageRect( grupovidas, "scene/game/img/shield.png", w, h )
		hearts[i].x = (i-1) * ( (w/2) + spacing )
    end
	
    for i = 1, grupovidas.numChildren do -- Iterera sobre todos los corazones, por debajo y por encima del valor de vida actual
        if i <= grupovidas.count then
            hearts[i].alpha = 1
        else
            hearts[i].alpha = 0.2
        end
    end
		return grupovidas.count
	end

	function grupovidas:heal( amount )
		self:damage( -( amount or 1 ) )
	end

	function grupovidas:finalize()
		-- eliminación de los objetos del grupo, instancia de limpieza 
	end
	grupovidas:addEventListener( "finalize" )
	-- Return instance
	return grupovidas
end

Ups! perdón, el ciclo for debería ser así:

    for i = grupovidas.numChildren+1, grupovidas.count do
		hearts[i] = display.newImageRect( grupovidas, "scene/game/img/shield.png", w, h )
		hearts[i].x = (i-1) * ( (w/2) + spacing )
    end

La única diferencia es el grupovidas.numChildren+1, antes si por ejemplo tenías 3 imágenes y tenías 4 vidas, iteraba del 3 al 4 (o sea que creaba un duplicado de la vida 3) ahora iterará solo de 4 a 4 (creando solo la imagen que falta)

1 Like

Otro detalle, no necesitas almacenar los corazones dentro de hearts ya que también puedes acceder de exactamente la misma forma a travez del grupo mismo.

Dicho en código sería:

    for i = 1, grupovidas.numChildren do -- Iterera sobre todos los corazones, por debajo y por encima del valor de vida actual
        if i <= grupovidas.count then
            grupovidas[i].alpha = 1
        else
            grupovidas[i].alpha = 0.2
        end
    end
1 Like

Muchísimas gracias depilz, :sweat_smile: va como la seda, ahora puedo continuar con mi juego.

Saludos y gracias de nuevo

1 Like