例如,設定相關畫面..遊戲畫面..說明畫面等等,
我們可以把同一個畫面相關程式放在同一個"xx.lua"檔裡,
然後利用Composer來切換不同的畫面(場景Scene),
The Template of Scene
每個Scene檔裡,都會有4個基本的function
local composer = require( "composer" ) local scene = composer.newScene() --------------------------------------------------------------------------------- function scene:create( event ) local sceneGroup = self.view -- Called when the scene's view does not exist. -- -- INSERT code here to initialize the scene -- e.g. add display objects to 'sceneGroup', add touch listeners, etc. end function scene:show( event ) local sceneGroup = self.view local phase = event.phase if phase == "will" then -- Called when the scene is still off screen and is about to move on screen elseif phase == "did" then -- Called when the scene is now on screen -- -- INSERT code here to make the scene come alive -- e.g. start timers, begin animation, play audio, etc. end end function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if event.phase == "will" then -- Called when the scene is on screen and is about to move off screen -- -- INSERT code here to pause the scene -- e.g. stop timers, stop animation, unload sounds, etc.) elseif phase == "did" then -- Called when the scene is now off screen end end function scene:destroy( event ) local sceneGroup = self.view -- Called prior to the removal of scene's "view" (sceneGroup) -- -- INSERT code here to cleanup the scene -- e.g. remove display objects, remove touch listeners, save state, etc. end --------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) --------------------------------------------------------------------------------- return scenecreate()是切換到此場景時先被呼叫的地方,我們可以這裡加入button等場景需要的物件以及相對應的function,
show()是場景要開始真正運作的進入點,我們在這裡加入需要的執行動作,例如播放音樂等等,
hide()是場景要被切換時會呼叫,也就是要離開場景時,
destroy()是場景被remove時會呼叫
main.lua
我們也可以在main.lua裡加入display相關物件,
在這裡加入的物件,不管如何切換場景,它們都會出現在畫面上,
可以視它們為global objects
-- hide device status bar display.setStatusBar( display.HiddenStatusBar ) -- require controller module local composer = require "composer" local widget = require "widget" local function runTab1(event ) composer.gotoScene( "scene1", "fade", 400 ) end local function runTab2(event ) composer.gotoScene( "scene2", "fade", 400 ) end local widget = require( "widget" ) -- Create buttons table for the tabBar local tabButtons = { { label = "tab1", id = "tab1", size = 40, onPress = runTab1, selected = true }, { label = "tab2", id = "tab2", size = 40, onPress = runTab2 } } -- Create tabBar at bottom of the screen local tabBar = widget.newTabBar { buttons = tabButtons } tabBar.y = display.contentHeight - (tabBar.height/2) print(display.contentHeight) runTab1()在這裡我們加入一個tabbar,
不管在那個場景,我們都可以這個tabbar切換場景,
composer.gotoScene( "scene1", "fade", 400 )表示要切到"scene1", 它需要有一個對應的"scene1.lua",
scene1.lua
local composer = require( "composer" ) local scene = composer.newScene() local widget = require "widget" --------------------------------------------------------------------------------- -- BEGINNING OF YOUR IMPLEMENTATION --------------------------------------------------------------------------------- local image, text1, text2, text3, memTimer -- Function to handle button events local function handleButtonEvent( event ) if ( "ended" == event.phase ) then composer.gotoScene( "scene2", "fade", 400 ) end end -- Called when the scene's view does not exist: function scene:create( event ) local sceneGroup = self.view text1 = display.newText( "Scene 1", 0, 0, native.systemFontBold, 24 ) text1:setFillColor( 255 ) text1.x, text1.y = display.contentWidth * 0.5, 50 sceneGroup:insert( text1 ) -- Create the widget local button1 = widget.newButton { left = 100, top = 320, id = "button1", label = "Goto Scene 2", onEvent = handleButtonEvent } sceneGroup:insert( button1 ) print( "\n1: create event") end function scene:show( event ) local phase = event.phase if "did" == phase then print( "1: show event, phase did" ) composer.removeScene( "scene2" ) end end function scene:hide( event ) local phase = event.phase if "will" == phase then print( "1: hide event, phase will" ) end end function scene:destroy( event ) print( "((destroying scene 1's view))" ) end --------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) --------------------------------------------------------------------------------- return scene在scene1裡我們加入了一個button,除了用原本的tabbar, 我們也可以利這個button來切換到scene2
scene2.lua
local composer = require( "composer" ) local scene = composer.newScene() local widget = require "widget" local image, text1, text2, text3, memTimer -- Function to handle button events local function handleButtonEvent( event ) if ( "ended" == event.phase ) then composer.gotoScene( "scene1", "fade", 400 ) end end function scene:create( event ) local sceneGroup = self.view text1 = display.newText( "Scene 2", 0, 0, native.systemFontBold, 24 ) text1:setFillColor( 255 ) text1.x, text1.y = display.contentWidth * 0.5, 50 sceneGroup:insert( text1 ) local button1 = widget.newButton { left = 100, top = 320, id = "button1", label = "Goto Scene 1", onEvent = handleButtonEvent } sceneGroup:insert( button1 ) print( "\n2: create event" ) end function scene:show( event ) local phase = event.phase if "did" == phase then print( "2: show event, phase did" ) composer.removeScene( "scene1" ) end end function scene:hide( event ) local phase = event.phase if "will" == phase then print( "2: hide event, phase will" ) end end function scene:destroy( event ) print( "2: destroying scene 2's view" ) end --------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) --------------------------------------------------------------------------------- return scenescene2和scene1類似,
當我們呼叫composer.gotoScene( "scene2", "fade", 400 )時,
scene1的hide()會先被呼叫,
然後是scene2的create(),再來是scene2的show(),
在scene2的show()裡面我們執行composer.removeScene( "scene1" ),
此時scene1的destroy()會被呼叫
謝謝,此教學很有幫助!
回覆刪除有些延伸問題想請教如果切換scene的時候,想要讓下方的tabbar的狀態也隨著要怎麼做呢?
您好,
回覆刪除以上的範例中,tabBar是在main.lua裡create,
如果您希望在切換scene時tabBar也跟著變,
那建議tabBar改成在各自的scene裡去create
謝謝~我試試看!
刪除