2014 年 12 月 23 日
教程:控制 Composer 场景切换
Corona 的 Composer 场景管理库 功能强大,使您能够将多个场景移入和移出屏幕。作为核心库的一部分,Composer 支持多种场景切换效果,包括:
- fade — 当前场景淡出,然后下一个场景淡入。
- zoomOutIn — 当前场景缩小到消失,然后新场景从无到有地展开并填充屏幕。
- zoomOutInFade — 类似于 zoomOutIn,但同时包含 fade 效果。
- zoomInOut — 场景的初始大小大于屏幕,缩小以适应屏幕,然后在关闭时放大。
- zoomInOutFade — 类似于 zoomInOut,但同时包含 fade 效果。
- flip — 场景缩放到宽度为 0,然后展开,从而产生翻转效果。
- flipFadeOutIn — flip 和 fade 效果的组合。
- zoomOutInRotate — 类似于 zoomOutIn,但同时包含 360 度旋转。
- zoomOutInFadeRotate — 类似于 zoomOutIn,但同时包含淡入淡出和 360 度旋转。
- zoomInOutRotate — 类似于 zoomInOut,但同时包含 360 度旋转。
- zoomInOutFadeRotate — 类似于 zoomOutIn,但同时包含淡入淡出和 360 度旋转。
- fromRight — 新场景从右侧滑动进入(覆盖现有场景)。
- fromLeft — 新场景从左侧滑动进入(覆盖现有场景)。
- fromTop — 新场景从顶部滑动进入(覆盖现有场景)。
- fromBottom — 新场景从底部滑动进入(覆盖现有场景)。
- slideLeft — 类似于 fromRight,但新场景将当前场景向左推开。
- slideRight — 类似于 fromLeft,但新场景将当前场景向右推开。
- slideUp — 类似于 fromBottom,但新场景将当前场景向上推开。
- slideDown — 类似于 fromTop,但新场景将当前场景向下推开。
- crossFade — 当前场景淡出,同时新场景淡入。
这些切换效果涵盖了您所需的大部分使用场景,但有时您可能需要稍微不同的行为。例如,假设您希望场景旋转 三 次,而不是仅一次,或者您希望新场景在移动到当前场景上方时淡入。本质上,如果您设想了一些以上列表中不存在的场景切换,请继续阅读,因为本教程将向您展示如何实现它。
介绍 “effectsList” 表
当您 require()
Composer 库时,您将获得对一个公共访问表的访问权限。这被称为 effectsList
表。在此表中,每个定义的效果都有两个子表:from
和 to
,并且在这些表中,有几个属性来控制切换行为。
在继续之前,从本教程中获取一个表格打印函数(包括 print_r()
函数)会很有帮助。然后,假设您的项目中包含了 Composer 库和 utility.lua
,请编写以下代码:
1 2 |
utility.print_r( composer.effectList ) |
在终端/控制台中,您可以检查输出并了解每个效果的管理方式。让我们看一下最简单的情况:fade
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
["fade"] = { ["from"] = { alphaStart = 1.0, alphaEnd = 0 }, ["to"] = { alphaStart = 0, alphaEnd = 1.0 } }, |
在这种情况下,切换效果名为 fade
(表中的第一个键)。它有两个子表:from
和 to
。这两个表都有两个子参数:alphaStart
和 alphaEnd
。实际上,Composer 库会获取 alphaStart
值并将其设置为场景的 alpha 属性,然后告诉 transition.to() 将 alpha 更改为 alphaEnd
值。
一个更复杂的示例是 zoomOutInFadeRotate
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
["zoomOutInFadeRotate"] = { ["from"] = { xEnd = displayW*0.5, yEnd = displayH*0.5, xScaleEnd = 0.001, yScaleEnd = 0.001, rotationStart = 0, rotationEnd = -360, alphaStart = 1.0, alphaEnd = 0 }, ["to"] = { xScaleStart = 0.001, yScaleStart = 0.001, xScaleEnd = 1.0, yScaleEnd = 1.0, xStart = displayW*0.5, yStart = displayH*0.5, xEnd = 0, yEnd = 0, rotationStart = -360, rotationEnd = 0, alphaStart = 0, alphaEnd = 1.0 }, hideOnOut = true }, |
在这种情况下,xScale
、yScale
、x
、y
、rotation
和 alpha
都设置了 Start
和 End
值,就像第一个示例中的 alpha
一样。
自定义转场
如果您想更改这些值,您可以在调用 composer.gotoScene() 或 composer.showOverlay() 之前的任何时间,通过简单地提供包含新值的适当表格来实现。 例如,如果您想使用 zoomOutInFadeRotate
将场景旋转三圈,只需将旋转值设置为 -1080
(3
×-360
)
1 2 3 |
composer.effectList.zoomOutInFadeRotate.from.rotationEnd = -1080 composer.effectList.zoomOutInFadeRotate.to.rotationStart = -1080 |
请记住,这些值将一直有效,直到它们被显式重置、应用程序重新启动或您取消 require()
Composer 库为止。
为了方便将来参考,可以在场景转场效果的 from
和 to
表中设置/更改的属性包括
xStart
,xEnd
yStart
,yEnd
alphaStart
,alphaEnd
xScaleStart
,xScaleEnd
yScaleStart
,yScaleEnd
rotationStart
,rotationEnd
transition
此外,还有一些可以在整个转场上设置的属性
hideOnOut
— 在完成时隐藏之前的场景(对于由于动画而可能仍然位于顶部的场景)。concurrent
— 指定to
和from
转场同时发生。sceneAbove
— 将新场景置于之前场景的上方。
例如,fade
和 crossFade
之间的唯一区别在于 crossFade
转场将 concurrent
设置为 true
。
调整转场缓动
您可能想要调整的另一件事是特定转场上的**缓动**,或者向没有缓动的场景转场效果添加缓动。 缓动允许转场基于多个预设选项以不同的方式表现(有关各种缓动算法的详细信息,请参阅 Corona 缓动 库)。
例如,如果您想在 fade
场景转场上应用缓动,请编写以下代码行
1 2 |
composer.effectList.fade.from.transition = easing.outQuad composer.effectList.fade.to.transition = easing.outQuad |
创建新的场景转场
与编辑现有场景转场效果类似,您也可以创建自己的转场效果。例如,您可以创建一个类似于 iOS 7 中看到的转场,其中原始场景和新场景以不同的速度转场,从而提供更有趣的动画效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
composer.effectList["iosSlideLeft"] = { sceneAbove = true, concurrent = true, to = { xStart = display.contentWidth, yStart = 0, xEnd = 0, yEnd = 0, transition = easing.outQuad }, from = { xStart = 0, yStart = 0, xEnd = -display.contentWidth * 0.3, yEnd = 0, transition = easing.outQuad } } composer.effectList["iosSlideRight"] = { sceneAbove = false, concurrent = true, to = { xStart = -display.contentWidth * 0.3, yStart = 0, xEnd = 0, yEnd = 0, transition = easing.outQuad }, from = { xStart = 0, yStart = 0, xEnd = display.contentWidth, yEnd = 0, transition = easing.outQuad } } |
结论
通过编辑和添加到可访问的 effectsList
表,您可以更改 Composer 在转场场景时的行为方式。 但是,请小心您指定的值,因为不正确的值可能会导致您的场景仅部分移出屏幕、完全颠倒等等。 不过,通过一些实验——这些实验都不会永久损坏 Composer 库——您可以实现的有趣场景转场效果实际上没有限制。
Vasya Uillison
发布于 23:27,12 月 23 日太酷了! 非常有用的教程!
JCH_APPLE
发布于 00:07,12 月 24 日圣诞老人真的存在
谢谢你,Rob,祝大家圣诞快乐
Simon Fearby
发布于 19:04,1 月 2 日示例项目
Rob Miracle
发布于 20:10,1 月 2 日从 CoronaSDK/SampleCode/Interface/Composer 获取示例代码
将上面的代码放入您的 main.lua 并进行尝试。
Rob
Space Wolf
发布于 12:49,3 月 11 日正是我需要的,谢谢!