Ciao,
Per gestire più scene in Corona hai bisogno di usare la Composer library
c’è un progetto di esempio distribuito con Corona che puoi analizzare per capire meglio come funziona, lo trovi insieme a Corona sul tuo pc/mac in SampleCode/Interface/Composer
Qui trovi una introduzione, con una struttura di esempio su come impostare il file .lua per una scena
https://coronalabs.com/blog/2014/01/21/introducing-the-composer-api-plus-tutorial/
Qui un altro tutorial
https://coronalabs.com/blog/2014/06/03/tutorial-understanding-the-composer-api/
Qui c’è la documentazione dell’API
http://docs.coronalabs.com/api/library/composer/index.html
Ora
In composer ogni scena è identificata da un file sorgente .Lua e la libreria mette a disposizione sia delle funzioni per la gestione delle scene, che degli eventi per l’esecuzione di codice in determinati momenti (descritti in dettaglio nella documentazione).
Le funzioni di composer consentono per esempio di creare una scena, passare ad una nuova scena, mostrare una scena in overlay e altro.
Gli eventi vengono segnalati alle scene di composer in quattro momenti ben precisi: alla creazione della scena ( create ), all’atto di mostrare la scena ( show ), all’atto di nascondere la scena ( hide ) e alla cancellazione della scena dalla memoria ( destroy ).
gli eventi show e hide inoltre vengono inviati due volte e per questo sono a loro volta suddivisi in due fasi chiamate _ will _ e _ did _; la fase will contraddistingue l’inizio dell’evento, la fase did la sua fine.
In una scena di composer quindi puoi definire delle funzioni che rispondano ai vari eventi inviati e in questo modo eseguire parti di codice in momenti diversi.
il codice scritto nella fase create verrà eseguito soltanto al caricamento della scena in memoria
Il codice per la fase show viene eseguito ogni volta che la scena viene mostrata
il codice per la parte hide viene eseguito ogni volta che la scena viene nascosta
il codice per la parte destroy viene eseguito quando la scena viene cancellata dalla memoria (non necessariamente ad ogni chiusura della scena perché composer cerca di tenere le scene in memoria finché gli e possibile).
In genere, in create si definiscono i displayObjects della scena, si caricano i suoni etc.
in show , fase will, si posizionano i displayObjects sullo schermo
in show , fase did, si fanno partire le animazioni, la fisica, i timers, i suoni etc.
in hide , fase will si fermano le animazioni, la fisica, i suoni, i timers, le transizioni etc.
in hide , fase did non resta più molto da fare e può servire solo a rimuovere la scena dalla memoria se lo si desidera.
Quello che potresti fare per il tuo progetto è:
in main.lua richiedere la libreria composer e, alla fine, usarla per passare alla tua prima scena (che potrebbe essere un menu, definito in menu.lua)
-- All'inizio di main.lua richiedi la libreria composer local composer = require "composer" -- Qui metti il resto di main.lua, con il codice di inizializzazione della tua app. -- l'ultima istruzione che viene eseguita in main.lua -- avverte composer di passare alla scena "menu.lua" composer.gotoScene("menu") -- il nome della scena è quello del suo sorgente senza il ".lua"
In menu.lua potresti creare il pulsante (nella fase create ) e nel suo touch handler indicare a composer che è il momento di passare ad un’altra scena (ipotizzo sia un gioco definito in game.lua)
Come struttura per le scene da usare con composer, usa quella che trovi qui https://coronalabs.com/blog/2014/01/21/introducing-the-composer-api-plus-tutorial/
nota: composer assegna ad ogni scena un displayGroup particolare (scene.view) che serve a “contenere” tutti gli oggetti che devono essere mostrati nella scena. Se vuoi che un displayObject (immagine, pulsante, gruppo etc) faccia parte della tua scena devi ricordarti di aggiungerlo (lui o un gruppo che lo contenga) a questo displayGroup.
Un possibile menu.lua (ho usato solo le fasi create e destroy )
local composer = require( "composer" ) local scene = composer.newScene() --------------------------------------------------------------------------------- -- All code outside of the listener functions will only be executed ONCE -- unless "composer.removeScene()" is called. --------------------------------------------------------------------------------- -- local forward references should go here local pulsante --------------------------------------------------------------------------------- -- "scene:create()" function scene:create( event ) local sceneGroup = self.view -- Initialize the scene here. -- Example: add display objects to "sceneGroup", add touch listeners, etc. -- Qui puoi creare il tuo pulsante -- per semplicità creo un semplice quadrato di 100 punti al centro dello schermo pulsante = display.newRect(display.contentCenterX,display.contentCenterY,100,100) -- nel touch handler del pulsante dici a composer di andare alla scena "game.lua" pulsante.touch = function (self, event) { if event.phase == "began" then composer.gotoScene( "game" ) end } pulsante:addEventListener("touch") -- Inserisci il pulsante in sceneGroup (che si riferisce a scene.view) sceneGroup:insert(pulsante) end -- "scene:show()" function scene:show( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then -- Called when the scene is still off screen (but is about to come on screen). elseif ( phase == "did" ) then -- Called when the scene is now on screen. -- Insert code here to make the scene come alive. -- Example: start timers, begin animation, play audio, etc. end end -- "scene:hide()" function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then -- Called when the scene is on screen (but is about to go off screen). -- Insert code here to "pause" the scene. -- Example: stop timers, stop animation, stop audio, etc. elseif ( phase == "did" ) then -- Called immediately after scene goes off screen. end end -- "scene:destroy()" function scene:destroy( event ) local sceneGroup = self.view -- Called prior to the removal of scene's view ("sceneGroup"). -- Insert code here to clean up the scene. -- Example: remove display objects, save state, etc. -- qui elimino il displayObject (forse non è necessario perché composer -- dovrebbe averlo abbia già eliminato insieme a scene.view) display.remove(pulsante) -- qui dichiaro nil la sua reference, per non lasciarne strascichi nella memoria pulsante = nil end --------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) --------------------------------------------------------------------------------- return scene
nel file game.lua, seguendo la stessa struttura di cui sopra, puoi mettere il codice del tuo gioco e se vuoi, con un altro pulsante o al game-over, usare composer.gotoScene(“menu”) per riportare l’utente al menu.
Spero che possa esserti utile, non ho testato il codice per vedere se ci sono errori ma il principio di funzionamento è comunque valido.
Ciao
G.