Scene (help)

Ciao a tutti.

Come già detto sono un principiante che sta cercando di imparare Corona SDK e devo dire che lo trovo stimolante.

Stavo provando a fare una APP di prova per capire come funzionano alcune cose, ma mi sono arenato.

Qualcuno di voi può aiutarmi??

Vorrei che ogni volta che clicco sul tasto “contatore” lo SCORE incrementi di 1 punto il suo valore.

Inoltre vorrei che il risultato venga memorizzato e conservi il punteggio anche quando l’APP viene chiusa e riaperta.

Ho allegato i file dell’app.

Qualcuno di voi mi può aiutare integrando e correggendo dove ho sbagliato? Perché fatico a capire alcuni passaggi…

Grazie e tutti e buona giornata!!

Per la prima parte della tua domanda 

local TotalScore = 0

Per la seconda parte della tua domanda basta aggiungere 

TotalScore = TotalScore + 1

per il vostro evento touch / tocco del pulsante. 

Per la terza parte della tua domanda è necessario guardare a questo tutorial / docs.

http://coronalabs.com/blog/2012/04/03/tutorial-database-access-in-corona/

http://docs.coronalabs.com/api/library/sqlite3/

Grazie per l’attenzione…

Per le prima risposta-

storyboard.state = {}

storyboard.state.score = 0

in modo tale da conservare il risultato anche tra scene in un prossimo futuro.

Per la seconda risposta ho inserito

 storyboard.state.score = storyboard.state.score + 1

purtroppo mi manca la funzione tap da inserire nell’evento. Penso di aver sbagliato come far interagire il TASTO1 con il contatore…

E necessario rimuovere quella roba dallo storyboard, vi imbatterete in tutti i tipi di problemi con questo. Invece fare un oggetto “globale” nel vostro main.lua come stato = {} e aggiungere / rimuovere tutti gli elementi a questo. 

Se lo fai sopra allora non si perde lo stato tra le scene :slight_smile:

avevo già usato i globals

ma il problema che non riesco a risolvere è un altro.

questo è il mio menu.lua


– menu.lua


– Remove ToolBar

display.setStatusBar(display.HiddenStatusBar)

–Require

local storyboard = require( “storyboard” )

local scene = storyboard.newScene()

local widget = require (“widget”)

local _H = display.contentHeight

local _W = display.contentWidth

storyboard.state = {}

storyboard.state.score = 0

function scene:createScene( event )

   

–TAST0 1

    local group = self.view

    local function scena1()

    storyboard.gotoScene(“scena1”)

    end

    

    local tasto1 = widget.newButton {

    defaultFile = “img/tasto1-rollover-a.png”,

    overFile = “img/tasto1-rollover-b.png”,

    onRelease = scena1

    }

    tasto1.x = _W/2

    tasto1.y = 800

       

    – CONTATORE

    

    local function tasto1Tap( event )

    storyboard.state.score = storyboard.state.score + 1

    return true

    end

    tasto1:addEventListener( “tap”, tasto1Tap )

    

    

    local scoreNumber = display.newText(storyboard.state.score, 200, 0, nil, 30)

    scoreNumber.x = _W/2 +50

    scoreNumber.y = 900

    local scoreText = display.newText(“SCORE:”, 0, 0, nil, 30)

    scoreText.x = _W/2 -50

    scoreText.y = 900

    

    group:insert(tasto1)

    

    

– TASTO 3 

    local tasto3 = widget.newButton{

      onRelease = doSomething,

      defaultFile = “img/tasto3-rollover-a.png”,

      overFile = “img/tasto3-rollover-b.png”,

    }

    tasto3.x = _W/2

    tasto3.y = 1000

    function tasto3:tap(event)

        system.openURL(“http://www.google.it”)

        end

        

    tasto3:addEventListener(“tap”, tasto3)

    group:insert(tasto3)

end

scene:addEventListener( “createScene”, scene )

scene:addEventListener( “exitScene”, scene )

scene:addEventListener( “destroyScene”, scene )

return scene

Ok, quindi la prima parte del tuo problema e che si sta aggiungendo un evento “tap” per i widget pulsante quindi vorrei cominciare da lì perche il codice sta creando problemi. 

Vedere l’esempio qui sotto, i pulsanti di widget gia hanno un proprio costruito nelle funzioni rubinetto / touch. 

https://docs.coronalabs.com/api/library/widget/newButton.html

---------------------------------------------------------------------------------- -- -- menu.lua -- ---------------------------------------------------------------------------------- -- Remove ToolBar display.setStatusBar(display.HiddenStatusBar) --Require local storyboard = require( "storyboard" ) local scene = storyboard.newScene() local widget = require ("widget") local \_H = display.contentHeight local \_W = display.contentWidth storyboard.state = {} storyboard.state.score = 0 function scene:createScene( event ) --TAST0 1 local group = self.view local scoreNumber = display.newText(storyboard.state.score, 200, 0, nil, 30) scoreNumber.x = \_W/2 +50 scoreNumber.y = 900 local scoreText = display.newText("SCORE:", 0, 0, nil, 30) scoreText.x = \_W/2 -50 scoreText.y = 900 local tasto1 = widget.newButton { defaultFile = "img/tasto1-rollover-a.png", overFile = "img/tasto1-rollover-b.png", onRelease = function() storyboard.state.score = storyboard.state.score + 1 storyboard.gotoScene("scena1") end } tasto1.x = \_W/2 tasto1.y = 800 group:insert(tasto1) -- TASTO 3 local tasto3 = widget.newButton{ onRelease = function() system.openURL("http://www.google.it") end, defaultFile = "img/tasto3-rollover-a.png", overFile = "img/tasto3-rollover-b.png", } tasto3.x = \_W/2 tasto3.y = 1000 end scene:addEventListener( "createScene", scene ) scene:addEventListener( "exitScene", scene ) scene:addEventListener( "destroyScene", scene ) return scene

Purtroppo non riesco ad inserire la funzione tap sul tasto1 per far si che lo score aumenti di  1

Perche no?

Ciao,

ho modificato il tuo file menu.lua, adesso il contatore viene incrementato di 1 ogni volta che clicchi il pulsante,

non è necessario aggiungere un altra funzione tap, il pulsante chiama già una funzione sull’evento onRelease,

almeno, se ho capito bene credo che sia questo quello che stavi cercando di fare.

Ale

[lua]



– menu.lua


– Remove ToolBar
display.setStatusBar(display.HiddenStatusBar)

–Require
local storyboard = require( “storyboard” )
local scene = storyboard.newScene()
local widget = require (“widget”)
local _H = display.contentHeight
local _W = display.contentWidth

local scoreNumber
local  score = 0

function scene:createScene( event )
   
–TAST0 1
    local group = self.view
    local function scena1()
    score = score +1
    scoreNumber.text = score    
    storyboard.gotoScene(“scena1”)
    end

    local tasto1 = widget.newButton {
    defaultFile = “img/tasto1-rollover-a.png”,
    overFile = “img/tasto1-rollover-b.png”,
    onRelease = scena1
    }
    tasto1.x = _W/2
    tasto1.y = 800
      
    – CONTATORE
    
    scoreNumber = display.newText(score, 200, 0, nil, 30)
    scoreNumber.x = _W/2 +50
    scoreNumber.y = 900

    local scoreText = display.newText(“SCORE:”, 0, 0, nil, 30)
    scoreText.x = _W/2 -50
    scoreText.y = 900

    group:insert(tasto1)
   
– TASTO 3
    local tasto3 = widget.newButton{
      onRelease = doSomething,
      defaultFile = “img/tasto3-rollover-a.png”,
      overFile = “img/tasto3-rollover-b.png”,
    }

    tasto3.x = _W/2
    tasto3.y = 1000

    function tasto3:tap(event)
        system.openURL(“http://www.google.it”)
        end
        
    tasto3:addEventListener(“tap”, tasto3)
    group:insert(tasto3)

end
scene:addEventListener( “createScene”, scene )
scene:addEventListener( “exitScene”, scene )
scene:addEventListener( “destroyScene”, scene )
return scene
 

[/lua]

Ciao Ale!!

Grazie dell’intervento!! Sei stato gentilissimo…

ho letto solo ora perché ero fuori per lavoro…

Ero comunque riuscito ad incrementare il contatore, anche se come hai scritto tu sembra più fluido…

Posso abusare ancora della tua gentilezza e capacità per capire un paio di cose?

Ad esempio, come faccio per far si che il contatore non venga mai cancellato quando si esce dall’applicazione? Mi servirebbe che resti visualizzato sempre il numero di click anche dopo 1 mese che non apro l’app…

Inoltre provando le scene in questa maniera MI SEMBRA che l’app risulti più pesante… sarebbe meglio lasciar stare le scene e fare tutto sul main.lua?

Ciao,

per mantenere il valore del contatore anche dopo aver chiuso l’app devi scrivere il valore quando viene aggiornato e poi rileggerlo quando l’app viene rilanciata.

Per fare questo ci sono vari modi e vari moduli che possono tornarti utili. Io uso ormai da anni la Preference Library, che puoi trovare su Code Exchange http://code.coronalabs.com/code/preference-library-save-data-files-tables-numbers-strings-and-boolean

Ci sono anche altre librerie che fanno la stessa cosa, ma questa è facile da implementare, e soprattutto è solida e funziona!

Per utilizzarla devi prima importare il modulo di libreria:

[lua]local preference = require “preference”[/lua]

Poi per salvare il valore del contatore:

[lua]preference.save{ contatore=valoreContatore }[/lua]

Per rileggere il valore salvato:

[lua]valoreContatore = preference.getValue(“contatore”)[/lua]

Di solito funziona al primo colpo.

Per lavorare con le scene è MANDATORIO usare sempre le librerie “storyboard” o “composer”, il main.lua di solito viene usato come entry point dell’applicazione e deve contenere pochissime istruzioni.

Se crei un progetto nuovo con Corona nella modalità “game” la struttura delle scene viene già creata dall’SDK.

Ale
 

Grazie Ale…

appena ho un po’ di tempo studio bene i tuoi suggerimenti!!!

A presto!!

Per la prima parte della tua domanda 

local TotalScore = 0

Per la seconda parte della tua domanda basta aggiungere 

TotalScore = TotalScore + 1

per il vostro evento touch / tocco del pulsante. 

Per la terza parte della tua domanda è necessario guardare a questo tutorial / docs.

http://coronalabs.com/blog/2012/04/03/tutorial-database-access-in-corona/

http://docs.coronalabs.com/api/library/sqlite3/

Grazie per l’attenzione…

Per le prima risposta-

storyboard.state = {}

storyboard.state.score = 0

in modo tale da conservare il risultato anche tra scene in un prossimo futuro.

Per la seconda risposta ho inserito

 storyboard.state.score = storyboard.state.score + 1

purtroppo mi manca la funzione tap da inserire nell’evento. Penso di aver sbagliato come far interagire il TASTO1 con il contatore…

E necessario rimuovere quella roba dallo storyboard, vi imbatterete in tutti i tipi di problemi con questo. Invece fare un oggetto “globale” nel vostro main.lua come stato = {} e aggiungere / rimuovere tutti gli elementi a questo. 

Se lo fai sopra allora non si perde lo stato tra le scene :slight_smile:

avevo già usato i globals

ma il problema che non riesco a risolvere è un altro.

questo è il mio menu.lua


– menu.lua


– Remove ToolBar

display.setStatusBar(display.HiddenStatusBar)

–Require

local storyboard = require( “storyboard” )

local scene = storyboard.newScene()

local widget = require (“widget”)

local _H = display.contentHeight

local _W = display.contentWidth

storyboard.state = {}

storyboard.state.score = 0

function scene:createScene( event )

   

–TAST0 1

    local group = self.view

    local function scena1()

    storyboard.gotoScene(“scena1”)

    end

    

    local tasto1 = widget.newButton {

    defaultFile = “img/tasto1-rollover-a.png”,

    overFile = “img/tasto1-rollover-b.png”,

    onRelease = scena1

    }

    tasto1.x = _W/2

    tasto1.y = 800

       

    – CONTATORE

    

    local function tasto1Tap( event )

    storyboard.state.score = storyboard.state.score + 1

    return true

    end

    tasto1:addEventListener( “tap”, tasto1Tap )

    

    

    local scoreNumber = display.newText(storyboard.state.score, 200, 0, nil, 30)

    scoreNumber.x = _W/2 +50

    scoreNumber.y = 900

    local scoreText = display.newText(“SCORE:”, 0, 0, nil, 30)

    scoreText.x = _W/2 -50

    scoreText.y = 900

    

    group:insert(tasto1)

    

    

– TASTO 3 

    local tasto3 = widget.newButton{

      onRelease = doSomething,

      defaultFile = “img/tasto3-rollover-a.png”,

      overFile = “img/tasto3-rollover-b.png”,

    }

    tasto3.x = _W/2

    tasto3.y = 1000

    function tasto3:tap(event)

        system.openURL(“http://www.google.it”)

        end

        

    tasto3:addEventListener(“tap”, tasto3)

    group:insert(tasto3)

end

scene:addEventListener( “createScene”, scene )

scene:addEventListener( “exitScene”, scene )

scene:addEventListener( “destroyScene”, scene )

return scene

Ok, quindi la prima parte del tuo problema e che si sta aggiungendo un evento “tap” per i widget pulsante quindi vorrei cominciare da lì perche il codice sta creando problemi. 

Vedere l’esempio qui sotto, i pulsanti di widget gia hanno un proprio costruito nelle funzioni rubinetto / touch. 

https://docs.coronalabs.com/api/library/widget/newButton.html

---------------------------------------------------------------------------------- -- -- menu.lua -- ---------------------------------------------------------------------------------- -- Remove ToolBar display.setStatusBar(display.HiddenStatusBar) --Require local storyboard = require( "storyboard" ) local scene = storyboard.newScene() local widget = require ("widget") local \_H = display.contentHeight local \_W = display.contentWidth storyboard.state = {} storyboard.state.score = 0 function scene:createScene( event ) --TAST0 1 local group = self.view local scoreNumber = display.newText(storyboard.state.score, 200, 0, nil, 30) scoreNumber.x = \_W/2 +50 scoreNumber.y = 900 local scoreText = display.newText("SCORE:", 0, 0, nil, 30) scoreText.x = \_W/2 -50 scoreText.y = 900 local tasto1 = widget.newButton { defaultFile = "img/tasto1-rollover-a.png", overFile = "img/tasto1-rollover-b.png", onRelease = function() storyboard.state.score = storyboard.state.score + 1 storyboard.gotoScene("scena1") end } tasto1.x = \_W/2 tasto1.y = 800 group:insert(tasto1) -- TASTO 3 local tasto3 = widget.newButton{ onRelease = function() system.openURL("http://www.google.it") end, defaultFile = "img/tasto3-rollover-a.png", overFile = "img/tasto3-rollover-b.png", } tasto3.x = \_W/2 tasto3.y = 1000 end scene:addEventListener( "createScene", scene ) scene:addEventListener( "exitScene", scene ) scene:addEventListener( "destroyScene", scene ) return scene

Purtroppo non riesco ad inserire la funzione tap sul tasto1 per far si che lo score aumenti di  1

Perche no?

Ciao,

ho modificato il tuo file menu.lua, adesso il contatore viene incrementato di 1 ogni volta che clicchi il pulsante,

non è necessario aggiungere un altra funzione tap, il pulsante chiama già una funzione sull’evento onRelease,

almeno, se ho capito bene credo che sia questo quello che stavi cercando di fare.

Ale

[lua]



– menu.lua


– Remove ToolBar
display.setStatusBar(display.HiddenStatusBar)

–Require
local storyboard = require( “storyboard” )
local scene = storyboard.newScene()
local widget = require (“widget”)
local _H = display.contentHeight
local _W = display.contentWidth

local scoreNumber
local  score = 0

function scene:createScene( event )
   
–TAST0 1
    local group = self.view
    local function scena1()
    score = score +1
    scoreNumber.text = score    
    storyboard.gotoScene(“scena1”)
    end

    local tasto1 = widget.newButton {
    defaultFile = “img/tasto1-rollover-a.png”,
    overFile = “img/tasto1-rollover-b.png”,
    onRelease = scena1
    }
    tasto1.x = _W/2
    tasto1.y = 800
      
    – CONTATORE
    
    scoreNumber = display.newText(score, 200, 0, nil, 30)
    scoreNumber.x = _W/2 +50
    scoreNumber.y = 900

    local scoreText = display.newText(“SCORE:”, 0, 0, nil, 30)
    scoreText.x = _W/2 -50
    scoreText.y = 900

    group:insert(tasto1)
   
– TASTO 3
    local tasto3 = widget.newButton{
      onRelease = doSomething,
      defaultFile = “img/tasto3-rollover-a.png”,
      overFile = “img/tasto3-rollover-b.png”,
    }

    tasto3.x = _W/2
    tasto3.y = 1000

    function tasto3:tap(event)
        system.openURL(“http://www.google.it”)
        end
        
    tasto3:addEventListener(“tap”, tasto3)
    group:insert(tasto3)

end
scene:addEventListener( “createScene”, scene )
scene:addEventListener( “exitScene”, scene )
scene:addEventListener( “destroyScene”, scene )
return scene
 

[/lua]