composer允许你拥有一个覆层场景。( 在任何时刻,只能有一个覆层场景被显示 )这是一种特殊的场景,可以加载之后覆盖在活动场景(父场景)之上。一个覆层场景的结构,和其他composer场景并无二致。
为了显示一个覆层场景,需要调用函数composer.showOverlay()。因为一个覆层场景一般不会覆盖住整个场景,用户可能随时和底下的父场景发生交互。如果你想阻止用户和父场景交互的话,那么可以把option中的isModal参数设置为true。这样做就可以阻止touch/tap事件穿过覆层场景到达父场景。
local options = { effect = "fade", time = 500, isModal = true } composer.showOverlay( "inventory", options )
当覆层场景被加载,他和其他场景一样都需要处理他的事件。也就是scene:create()、scene:show()、scene:hide()和scene:destroy()将和其他场景一样的调用规则。
为了隐藏一个覆层场景,并返回父场景,可以使用composer.hideOverlay()调用,例如:
composer.hideOverlay( "fromBottom", 400 )
这个调用可以来自覆层场景,也可以来自父场景,或者来自其他事件处理函数,例如安卓的“back”键。当你通过composer.gotoScene()跳转到其他场景时,就会自动将覆层场景隐藏。
小结:
覆层场景似乎适合制作游戏中的弹出窗口,无论是局部弹窗还是全屏弹窗。可以在其他场景中随时调出,也可以随时隐藏。结合不同的转场特效,覆层场景制作游戏弹窗应该是不错的选择。
类似一些app的底部常驻的导航按钮,貌似不适合使用覆层场景,因为使用gotoScene切换场景的时候会自动隐藏覆层场景。那些功能可能更适合做成脱离于scene的displayObject。
当显示或隐藏一个覆层场景时,你可能需要对父场景做一些动作。例如,你可能需要从覆层场景中手机一些输入或选择,然后更新数据到父场景中。在Composer中,覆层场景可以通过event.parent来访问父场景对象。这允许你访问父场景的属性和方法,并在覆层场景显示或隐藏时和父场景对象通信。例如:
------------------------------------------------------------------------------ -- In "scene1.lua" (parent scene) ------------------------------------------------------------------------------ local composer = require( "composer" ) local scene = composer.newScene() -- Custom function for resuming the game (from pause state) function scene:resumeGame() --code to resume game end -- Options table for the overlay scene "pause.lua" local options = { isModal = true, effect = "fade", time = 400, params = { sampleVar = "my sample variable" } } -- By some method (a pause button, for example), show the overlay composer.showOverlay( "pause", options ) return scene ------------------------------------------------------------------------------ -- In "pause.lua" ------------------------------------------------------------------------------ local composer = require( "composer" ) local scene = composer.newScene() function scene:hide( event ) local sceneGroup = self.view local phase = event.phase local parent = event.parent --reference to the parent scene object if ( phase == "will" ) then -- Call the "resumeGame()" function in the parent scene parent:resumeGame() end end -- By some method (a "resume" button, for example), hide the overlay composer.hideOverlay( "fade", 400 ) scene:addEventListener( "hide", scene ) return scene
Composer提供了一些便捷的方法和属性来协助你进行场景管理。
你可以存储全局的名值对变量到composer模块中,这些值可以在场景间被互相访问。为了设置一个可能被另一个composer场景访问的变量,可以使用composer.setVariable()函数,例如:
composer.setVariable( "gameLevel", 1 ) composer.setVariable( "playerName", "Zorron" )
然后,为了从另一个场景获得这个变量:
local playerName = composer.getVariable( "playerName" )
为了获得一个场景名,可以使用composer.getSceneName()函数,传给它一个字符串,值为下面的其中一个:
local currScene = composer.getSceneName( "current" ) local prevScene = composer.getSceneName( "previous" ) local overlayScene = composer.getSceneName( "overlay" )
composer.stage属性会返回一个顶层的composer的display group的引用,所有场景的view对象都被插入其中。你可以理解为“compose场景层”,这在当你需要放置一个显示对象到所有composer场景之上或之下时,会很有用,甚至在动画特效进行期间。例如:
举个例子:
composer.stage:toBack() composer.stage:toFront()
composer.isDebug属性可以切换"composer调试模式",如果设置为true,通常在corona模拟器控制台会打印有用的调试信息。在构建用于部署的项目之前,应该把设置为false(默认值)。