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(默认值)。

posted @ 2015-01-20 11:43  弯弓射月  阅读(1416)  评论(0编辑  收藏  举报