Jump to content

[TOPIC: topicViewTemplate]
[GLOBAL: userSmallPhoto]
Photo

Cambio di scena
Started by daddi98 Nov 01 2015 09:03 AM

7 replies to this topic
scena storyboard
[TOPIC CONTROLS]
This topic has been archived. This means that you cannot reply to this topic.
[/TOPIC CONTROLS]
[modOptionsDropdown]
[/modOptionsDropdown]
[reputationFilter]
[TOPIC: post.html]
#1

daddi98

[GLOBAL: userInfoPane.html]
daddi98
  • Observer

  • 5 posts
  • Corona SDK

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. :)



[TOPIC: post.html]
#2

Arteficio

[GLOBAL: userInfoPane.html]
Arteficio
  • Enthusiast

  • 83 posts
  • Corona SDK

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.
 


[TOPIC: post.html]
#3

daddi98

[GLOBAL: userInfoPane.html]
daddi98
  • Observer

  • 5 posts
  • Corona SDK

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:

 

-----------------------------------------------------------------------------------------
--
-- 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



[TOPIC: post.html]
#4

Arteficio

[GLOBAL: userInfoPane.html]
Arteficio
  • Enthusiast

  • 83 posts
  • Corona SDK

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.

[TOPIC: post.html]
#5

daddi98

[GLOBAL: userInfoPane.html]
daddi98
  • Observer

  • 5 posts
  • Corona SDK

Ok grazie 

g.sciacchitano

 cosi con un codice davanti capisco meglio



[TOPIC: post.html]
#6

Arteficio

[GLOBAL: userInfoPane.html]
Arteficio
  • Enthusiast

  • 83 posts
  • Corona SDK

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.


[TOPIC: post.html]
#7

daddi98

[GLOBAL: userInfoPane.html]
daddi98
  • Observer

  • 5 posts
  • Corona SDK

Ciao mi da qusto errore :

 

http://imgur.com/pnrvcdR

 

 

e questo è il codice(main.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"
 
e questo è il menu.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
 
spero che riesci a risolvermi grazie e ciao g.sciacchitano
 
 



[TOPIC: post.html]
#8

Arteficio

[GLOBAL: userInfoPane.html]
Arteficio
  • Enthusiast

  • 83 posts
  • Corona SDK

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



[topic_controls]
 
[/topic_controls]