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