Alguien sabe como integrar este módulo en mi grupo de escena?

Hola de nuevo. Intentaré explicarme bien a ver si alguien me puede ayudar:

He conseguido un módulo para añadir salvar u buscar puntuación a un juego: score.lua:

--score.lua local M = {} --crea módulo local (esto mantendrá nuestras funciones y datos) M.score = 0 --la puntuación inicial a 0 function M.init( options ) local customOptions = options or {} local opt = {} opt.fontSize = customOptions.fontSize or 24 opt.font = customOptions.font or native.systemFontBold opt.x = customOptions.x or display.contentCenterX opt.y = customOptions.y or opt.fontSize \* 0.5 opt.maxDigits = customOptions.maxDigits or 6 opt.leadingZeros = customOptions.leadingZeros or false -- verdadero o falso : ¿quieres ceros a la izquierda? M.filename = customOptions.filename or "scorefile.txt" local prefix = "" if opt.leadingZeros then prefix = "0" end M.format = "%" .. prefix .. opt.maxDigits .. "d" M.scoreText = display.newText(string.format(M.format, 0), opt.x, opt.y, opt.font, opt.fontSize) M.scoreText.alpha=0 transition.to(M.scoreText,{time=3000,alpha=1}) return M.scoreText end ------------------------------------------------------------------------------------- function M.set( value ) M.score = value M.scoreText.text = string.format(M.format, M.score) end function M.get() return M.score end function M.add( amount ) M.score = M.score + amount M.scoreText.text = string.format(M.format, M.score) end ------------------------------------------------------------------------------------------- function M.save() local path = system.pathForFile( M.filename, system.DocumentsDirectory) local file = io.open(path, "w") if file then local contents = tostring( M.score ) file:write( contents ) io.close( file ) return true else print("Error: could not read ", M.filename, ".") return false end end function M.load() local path = system.pathForFile( M.filename, system.DocumentsDirectory) local contents = "" local file = io.open( path, "r" ) if file then -- leer todo el contenido del archivo en una cadena local contents = file:read( "\*a" ) local score = tonumber(contents); io.close( file ) return score end print("Could not read scores from ", M.filename, ".") return nil end return M

Para llamar a este módulo desde mi escena1.lua lo hago de la siguiente manera:

local score = require( “score” ). Hasta aquí todo bien, me muestra la puntuación, puedo salvar y buscar la última puntuación etc. Os muestro parte del ´codigo de la escena 1:

local score = require( "score" ) local storyboard = require ("storyboard") local scene = storyboard.newScene() function scene:createScene(event) local screenGroup = self.view --aquí iría el code para insertar los objetos etc. --No lo he puesto para no liar mucho el code end ---------------------------------------------------------------------------------------- ----------------------------------PUNTUACIÓN DEL JUEGO---------------------------------- -- Etiqueta para la puntuación en pantalla scoreText1 = display.newText( "Puntuación:", 470, 22, "AmericanTypewriter-Bold", 35 ) scoreText1.alpha=0 transition.to(scoreText1,{time=3000,alpha=1}) scoreText1:setTextColor( 217, 233, 33) --\> blanco scoreText1.x = display.contentCenterX - 330 scoreText1.y = 20 -------------------------------------- local scoreText = score.init({ fontSize = 35, font = "Helvetica", x = display.contentCenterX -195, y = 20, maxDigits = 4, leadingZeros = true, -- verdadero o falso : ¿quieres ceros a la izquierda? filename = "scorefile.txt", }) local function saveScore( event ) if event.phase == "ended" then score.save() end return true end local saveButton = widget.newButton({ width = 200, height = 64, x = display.contentCenterX, y = display.contentHeight - 32, label = "Salvar puntuación", labelColor = { default = { 1, 1, 1 }, over = { 0, 0, 0 } }, fontSize = 32, onEvent = saveScore }) local function loadScore( event ) if event.phase == "ended" then local prevScore = score.load() if prevScore then score.set(prevScore) end end return true end local saveButton = widget.newButton({ width = 200, height = 64, x = display.contentCenterX, y = display.contentHeight - 64, label = "Última puntuación", labelColor = { default = { 1, 1, 1 }, over = { 0, 0, 0 } }, fontSize = 32, onEvent = loadScore }) ----------------------------------FIN PUNTUACIÓN DEL JUEGO--------------------------------- function scene:exitScene( event )     local screenGroup = self.view Runtime:removeEventListener("collision", onCollision\_1)     Runtime:removeEventListener("collision", onCollision\_2)     Runtime:removeEventListener("enterFrame", ball) end function scene:destroyScene( event )     local screenGroup = self.view end --------------------------------------------------------------------------------- -- END OF YOUR IMPLEMENTATION --------------------------------------------------------------------------------- scene:addEventListener( "createScene", scene ) scene:addEventListener( "enterScene", scene ) scene:addEventListener( "exitScene", scene ) scene:addEventListener( "destroyScene", scene ) --------------------------------------------------------------------------------- return scene

Los inconvenientes son los siguientes:

Para empezar, no me deja integrarlo en mi grupo de scena: 

function scene:createScene(event) local screenGroup = self.view

Lo tengo que poner fuera como lo muestro en escena1.lua.

Tampoco se como manejar las variables de este módulo exterior, por ej:

Cuando termino un nivel puedo hacer invisible el display del texto usando la variable scoreText:

scoreText.isVisible = false 

Esto lo hago para que cuando termine un nivel y me pase al menú, no se muestre la puntuación pero, cuando paso a la segunda escena y pongo:

--escena2.lua local score = require( "score" ) scoreText.isVisible = true

…no me muestra la puntuación de la escena 1. tendría que volver a insertar:

 local scoreText = score.init({ fontSize = 35, font = "Helvetica", x = display.contentCenterX -195, y = 20, maxDigits = 4, leadingZeros = true, filename = "scorefile.txt", })

…y me pondría la puntuación a cero.

Espero haberme explicado bien, si alguien me puede ayudar…

Saludos :frowning:

Hola quinohp.

Tienes que hacer 2 cosas para conseguir su trabajo puntuación:

  1. Exigir el módulo (’ local score = require( “score” )  ’  -  Usted ya ha hecho eso)

  2. Crear el widget puntuación. Usted lo hace llamando a la función init(). El objeto devuelto es el que se añade a el group de la escena. Tenga cuidado de que agregarlo al group de la escena, cuando se mueve a otra escena, el objeto se habrá eliminado y hay que llamar a init() de nuevo en su nueva escena.

Si usted quiere tener el objeto puntuación siempre allí (y controlarlo es la visibilidad de forma manual), puede llamar al init() en su primer nivel y NO añade al grupo de escena. También, que sea seguro que objeto está en una variable global, para que pueda acceder a él en las otras escenas más tarde.

Ok, thank you Renato.

No había caído en la variable global, quedaría así:

score.scoreText.isVisible = false 

Saludos y gracias.  :)  :)  :slight_smile:

Hola quinohp.

Tienes que hacer 2 cosas para conseguir su trabajo puntuación:

  1. Exigir el módulo (’ local score = require( “score” )  ’  -  Usted ya ha hecho eso)

  2. Crear el widget puntuación. Usted lo hace llamando a la función init(). El objeto devuelto es el que se añade a el group de la escena. Tenga cuidado de que agregarlo al group de la escena, cuando se mueve a otra escena, el objeto se habrá eliminado y hay que llamar a init() de nuevo en su nueva escena.

Si usted quiere tener el objeto puntuación siempre allí (y controlarlo es la visibilidad de forma manual), puede llamar al init() en su primer nivel y NO añade al grupo de escena. También, que sea seguro que objeto está en una variable global, para que pueda acceder a él en las otras escenas más tarde.

Ok, thank you Renato.

No había caído en la variable global, quedaría así:

score.scoreText.isVisible = false 

Saludos y gracias.  :)  :)  :slight_smile: