Cambio di scena

Scrivo per chiedervi se c’è qualcuno disponibile che potrebbe rispondermi scrivendo come attraverso il tocco di un pulsante la scena attuale cambiasse e andasse su un’altra scena diversa con altre immagini ecc…

come si crea una scena?

Un’altra mia domanda è: devo fare un file.lua per scena?

Per favore rispondetemi in modo dettagliato non solo usa le API storyboard ecc… ma in modo che riesca a capire perchè sono 3 giorni che mi scervello.

Grazie  a chi proverà ad aiutarmi. :slight_smile:

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.

Ciao grazie g.sciacchitano per la risposta ma non ho capito bene che codice scrivere nel main.lua nel senso scrivo solo che vada subito ad un altra scena che inizializza tutto oppure scrivo la prima scena nel main?

Io ho fatto cosi ma non so se vada bene:

[lua]-----------------------------------------------------------------------------------------

– main.lua


– Your code here

–display.setStatusBar(display.HiddenStatusBar) --Nasconde la statusbar del telefono

local composer = require( “composer” ) – richiamo la libreria composer
local scene = composer.newScene() --Creo la scena

–ALLA CREAZIONE
local scene:create(event):
 local sceneGroup = self.view

 local background = display.newImage("./img/SfondoScena1.jpg")
 background.x = display.contentCenterX
 background.y = display.contentCenterY

 local egg = display.newImage("./img/egg.png",0,0,true)
 egg.x = display.contentWidth - 320
 egg.y = display.contentHeight - 600

 ---- nel touch handler del pulsante dici a composer di andare alla scena “game.lua”
 egg.touch = function (self, event) {
 if event.phase == “began” then
  composer.gotoScene( “game” )
    end
    }

 egg:addEventListener(“touch”)
 – Inserisci il pulsante in sceneGroup (che si riferisce a scene.view)
 sceneGroup:insert(egg)
 sceneGroup:insert(background)
 
end[/lua]

Ciao
Io userei main.lua solo per il codice di inizializzazione che è indipendente dalle scene, tipo display.setStatusBar o altre cose come l’inizializzazione di ads, in app purchases etc.
Poi passi subito alla prima scena, che può essere menu.lua.
Ora sono al tel e non riesco a scrivere codice. domani provo a mandarti un esempio con più calma.

Ok grazie 

g.sciacchitano

 cosi con un codice davanti capisco meglio

Ciao

main.lua viene eseguito solo una volta, quando viene lanciata l’applicazione, e per questo ti conviene usarlo per metterci soltanto quel codice che va eseguito solo una volta e soltanto al lancio dell’app.

Nel tuo caso puoi cominciare con un main.lua minimale.

-- main.lua local composer = require( "composer" ) -- richiamo la libreria composer composer.gotoScene("menu") -- Apro la scena "menu.lua"

questo può essere il sorgente per menu.lua

-- menu.lua 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 egg --------------------------------------------------------------------------------- -- "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 local background = display.newImage("./img/SfondoScena1.jpg") background.x = display.contentCenterX background.y = display.contentCenterY -- egg è già stata dichiarata come forward reference in testa al sorgente egg = display.newImage("./img/egg.png",0,0,true) egg.x = display.contentWidth - 320 egg.y = display.contentHeight - 600 ---- nel touch handler del pulsante dici a composer di andare alla scena "game.lua" egg.touch = function (self, event) { if event.phase == "began" then composer.gotoScene( "game" ) end } egg:addEventListener("touch") -- Inserisci lo sfondo in sceneGroup sceneGroup:insert(background) -- Inserisci il pulsante in sceneGroup (che si riferisce a scene.view) sceneGroup:insert(egg) 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 display.remove(egg) -- qui dichiaro nil la sua reference, per non lasciarne strascichi nella memoria egg = nil end -------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) -------------------------------------------------------------------------------- return scene

Poi in game.lua metti il codice del tuo gioco vero e proprio, seguendo la stessa struttura usata per menu.lua (creazione display objects nella funzione “create”, attivazione nella funzione “show” etc…)

Spero ti sia di aiuto

Ciao

G.

Ciao mi da qusto errore :

http://imgur.com/pnrvcdR

e questo è il codice(main.lua):

[lua]



– main.lua


– Your code here

display.setStatusBar(display.HiddenStatusBar)

local composer = require( “composer” ) – richiamo la libreria composer
composer.gotoScene(“menu”) – Apro la scena “menu.lua”[/lua]

e questo è il menu.lua:

[lua]

local composer = require( “composer” )
local scene = composer.newScene()

–ALLA CREAZIONE

local scene:create(event):
 local sceneGroup = self.view

 local background = display.newImage("./img/SfondoScena1.jpg")
 background.x = display.contentCenterX
 background.y = display.contentCenterY

 local egg = display.newImage("./img/egg.png",0,0,true)
 egg.x = display.contentWidth - 320
 egg.y = display.contentHeight - 600

 --nel touch handler del pulsante dici a composer di andare alla scena “game.lua”
 egg.touch = function (self, event) {
 if event.phase == “began” then
  composer.gotoScene( “menu” )
    end
    }

 egg:addEventListener(“touch”)
 – Inserisci il pulsante in sceneGroup (che si riferisce a scene.view)
 sceneGroup:insert(egg)
 sceneGroup:insert(background)
 
end

scene:addEventListener( “create”, scene )
return scene[/lua]

spero che riesci a risolvermi grazie e ciao g.sciacchitano

Si,

non avevo testato il codice e ho fatto una svista

ecco il menu.lua che dovrebbe funzionare

-- menu.lua 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 egg --------------------------------------------------------------------------------- -- "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 local background = display.newImage("./img/SfondoScena1.jpg") background.x = display.contentCenterX background.y = display.contentCenterY -- egg è già stata dichiarata come forward reference in testa al sorgente egg = display.newImage("./img/egg.png",0,0,true) egg.x = display.contentWidth - 320 egg.y = display.contentHeight - 600 ---- nel touch handler del pulsante dici a composer di andare alla scena "game.lua" egg.touch = function (self, event) if event.phase == "began" then composer.gotoScene( "game" ) end end egg:addEventListener("touch") -- Inserisci lo sfondo in sceneGroup sceneGroup:insert(background) -- Inserisci il pulsante in sceneGroup (che si riferisce a scene.view) sceneGroup:insert(egg) 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 display.remove(egg) -- qui dichiaro nil la sua reference, per non lasciarne strascichi nella memoria egg = nil end -------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) -------------------------------------------------------------------------------- return scene

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.

Ciao grazie g.sciacchitano per la risposta ma non ho capito bene che codice scrivere nel main.lua nel senso scrivo solo che vada subito ad un altra scena che inizializza tutto oppure scrivo la prima scena nel main?

Io ho fatto cosi ma non so se vada bene:

[lua]-----------------------------------------------------------------------------------------

– main.lua


– Your code here

–display.setStatusBar(display.HiddenStatusBar) --Nasconde la statusbar del telefono

local composer = require( “composer” ) – richiamo la libreria composer
local scene = composer.newScene() --Creo la scena

–ALLA CREAZIONE
local scene:create(event):
 local sceneGroup = self.view

 local background = display.newImage("./img/SfondoScena1.jpg")
 background.x = display.contentCenterX
 background.y = display.contentCenterY

 local egg = display.newImage("./img/egg.png",0,0,true)
 egg.x = display.contentWidth - 320
 egg.y = display.contentHeight - 600

 ---- nel touch handler del pulsante dici a composer di andare alla scena “game.lua”
 egg.touch = function (self, event) {
 if event.phase == “began” then
  composer.gotoScene( “game” )
    end
    }

 egg:addEventListener(“touch”)
 – Inserisci il pulsante in sceneGroup (che si riferisce a scene.view)
 sceneGroup:insert(egg)
 sceneGroup:insert(background)
 
end[/lua]

Ciao
Io userei main.lua solo per il codice di inizializzazione che è indipendente dalle scene, tipo display.setStatusBar o altre cose come l’inizializzazione di ads, in app purchases etc.
Poi passi subito alla prima scena, che può essere menu.lua.
Ora sono al tel e non riesco a scrivere codice. domani provo a mandarti un esempio con più calma.

Ok grazie 

g.sciacchitano

 cosi con un codice davanti capisco meglio

Ciao

main.lua viene eseguito solo una volta, quando viene lanciata l’applicazione, e per questo ti conviene usarlo per metterci soltanto quel codice che va eseguito solo una volta e soltanto al lancio dell’app.

Nel tuo caso puoi cominciare con un main.lua minimale.

-- main.lua local composer = require( "composer" ) -- richiamo la libreria composer composer.gotoScene("menu") -- Apro la scena "menu.lua"

questo può essere il sorgente per menu.lua

-- menu.lua 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 egg --------------------------------------------------------------------------------- -- "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 local background = display.newImage("./img/SfondoScena1.jpg") background.x = display.contentCenterX background.y = display.contentCenterY -- egg è già stata dichiarata come forward reference in testa al sorgente egg = display.newImage("./img/egg.png",0,0,true) egg.x = display.contentWidth - 320 egg.y = display.contentHeight - 600 ---- nel touch handler del pulsante dici a composer di andare alla scena "game.lua" egg.touch = function (self, event) { if event.phase == "began" then composer.gotoScene( "game" ) end } egg:addEventListener("touch") -- Inserisci lo sfondo in sceneGroup sceneGroup:insert(background) -- Inserisci il pulsante in sceneGroup (che si riferisce a scene.view) sceneGroup:insert(egg) 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 display.remove(egg) -- qui dichiaro nil la sua reference, per non lasciarne strascichi nella memoria egg = nil end -------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) -------------------------------------------------------------------------------- return scene

Poi in game.lua metti il codice del tuo gioco vero e proprio, seguendo la stessa struttura usata per menu.lua (creazione display objects nella funzione “create”, attivazione nella funzione “show” etc…)

Spero ti sia di aiuto

Ciao

G.

Ciao mi da qusto errore :

http://imgur.com/pnrvcdR

e questo è il codice(main.lua):

[lua]



– main.lua


– Your code here

display.setStatusBar(display.HiddenStatusBar)

local composer = require( “composer” ) – richiamo la libreria composer
composer.gotoScene(“menu”) – Apro la scena “menu.lua”[/lua]

e questo è il menu.lua:

[lua]

local composer = require( “composer” )
local scene = composer.newScene()

–ALLA CREAZIONE

local scene:create(event):
 local sceneGroup = self.view

 local background = display.newImage("./img/SfondoScena1.jpg")
 background.x = display.contentCenterX
 background.y = display.contentCenterY

 local egg = display.newImage("./img/egg.png",0,0,true)
 egg.x = display.contentWidth - 320
 egg.y = display.contentHeight - 600

 --nel touch handler del pulsante dici a composer di andare alla scena “game.lua”
 egg.touch = function (self, event) {
 if event.phase == “began” then
  composer.gotoScene( “menu” )
    end
    }

 egg:addEventListener(“touch”)
 – Inserisci il pulsante in sceneGroup (che si riferisce a scene.view)
 sceneGroup:insert(egg)
 sceneGroup:insert(background)
 
end

scene:addEventListener( “create”, scene )
return scene[/lua]

spero che riesci a risolvermi grazie e ciao g.sciacchitano

Si,

non avevo testato il codice e ho fatto una svista

ecco il menu.lua che dovrebbe funzionare

-- menu.lua 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 egg --------------------------------------------------------------------------------- -- "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 local background = display.newImage("./img/SfondoScena1.jpg") background.x = display.contentCenterX background.y = display.contentCenterY -- egg è già stata dichiarata come forward reference in testa al sorgente egg = display.newImage("./img/egg.png",0,0,true) egg.x = display.contentWidth - 320 egg.y = display.contentHeight - 600 ---- nel touch handler del pulsante dici a composer di andare alla scena "game.lua" egg.touch = function (self, event) if event.phase == "began" then composer.gotoScene( "game" ) end end egg:addEventListener("touch") -- Inserisci lo sfondo in sceneGroup sceneGroup:insert(background) -- Inserisci il pulsante in sceneGroup (che si riferisce a scene.view) sceneGroup:insert(egg) 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 display.remove(egg) -- qui dichiaro nil la sua reference, per non lasciarne strascichi nella memoria egg = nil end -------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) -------------------------------------------------------------------------------- return scene