转载

CoronaSDK场景管理库:Composer library (下)

1 覆层场景

composer允许你拥有一个覆层场景。( 在任何时刻,只能有一个覆层场景被显示 )这是一种特殊的场景,可以加载之后覆盖在活动场景(父场景)之上。一个覆层场景的结构,和其他composer场景并无二致。

1.1 显示一个覆层场景

为了显示一个覆层场景,需要调用函数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()将和其他场景一样的调用规则。

1.2 隐藏一个覆层场景

为了隐藏一个覆层场景,并返回父场景,可以使用composer.hideOverlay()调用,例如:

composer.hideOverlay( "fromBottom", 400 )

这个调用可以来自覆层场景,也可以来自父场景,或者来自其他事件处理函数,例如安卓的“back”键。当你通过composer.gotoScene()跳转到其他场景时,就会自动将覆层场景隐藏。

小结:

覆层场景似乎适合制作游戏中的弹出窗口,无论是局部弹窗还是全屏弹窗。可以在其他场景中随时调出,也可以随时隐藏。结合不同的转场特效,覆层场景制作游戏弹窗应该是不错的选择。

类似一些app的底部常驻的导航按钮,貌似不适合使用覆层场景,因为使用gotoScene切换场景的时候会自动隐藏覆层场景。那些功能可能更适合做成脱离于scene的displayObject。

1.3 访问父场景

当显示或隐藏一个覆层场景时,你可能需要对父场景做一些动作。例如,你可能需要从覆层场景中手机一些输入或选择,然后更新数据到父场景中。在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 

2 其他 方法/属性

Composer提供了一些便捷的方法和属性来协助你进行场景管理。

2.1 set/get变量

你可以存储全局的名值对变量到composer模块中,这些值可以在场景间被互相访问。为了设置一个可能被另一个composer场景访问的变量,可以使用composer.setVariable()函数,例如:

composer.setVariable( "gameLevel", 1 ) composer.setVariable( "playerName", "Zorron" )

然后,为了从另一个场景获得这个变量:

local playerName = composer.getVariable( "playerName" )

2.2 获得一个场景名

为了获得一个场景名,可以使用composer.getSceneName()函数,传给它一个字符串,值为下面的其中一个:

  • "current":获得当前场景名
  • "previous":获得之前显示的一个场景名
  • "overlay":获得覆层场景的名字(如果它在显示中)
local currScene = composer.getSceneName( "current" ) local prevScene = composer.getSceneName( "previous" ) local overlayScene = composer.getSceneName( "overlay" )

3 Composer Stage Object

composer.stage属性会返回一个顶层的composer的display group的引用,所有场景的view对象都被插入其中。你可以理解为“compose场景层”,这在当你需要放置一个显示对象到所有composer场景之上或之下时,会很有用,甚至在动画特效进行期间。例如:

  • 一个被显示在所有composer场景下面的背景图片,始终保持静止,甚至在场景切换期间都静止
  • 一个一直显示在所有composer场景顶层的tab或UI bar
  • HUD(顶层显示)的元素,例如血量、分数等

举个例子:

composer.stage:toBack()  composer.stage:toFront()

4 场景调试

composer.isDebug属性可以切换"composer调试模式",如果设置为true,通常在corona模拟器控制台会打印有用的调试信息。在构建用于部署的项目之前,应该把设置为false(默认值)。

正文到此结束
Loading...