教程:控制 Composer 场景切换

教程:控制 Composer 场景切换

Corona 的 Composer 场景管理库 功能强大,使您能够将多个场景移入和移出屏幕。作为核心库的一部分,Composer 支持多种场景切换效果,包括:

  • fade — 当前场景淡出,然后下一个场景淡入。
  • zoomOutIn — 当前场景缩小到消失,然后新场景从无到有地展开并填充屏幕。
  • zoomOutInFade — 类似于 zoomOutIn,但同时包含 fade 效果。
  • zoomInOut — 场景的初始大小大于屏幕,缩小以适应屏幕,然后在关闭时放大。
  • zoomInOutFade — 类似于 zoomInOut,但同时包含 fade 效果。
  • flip — 场景缩放到宽度为 0,然后展开,从而产生翻转效果。
  • flipFadeOutInflipfade 效果的组合。
  • 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 表。在此表中,每个定义的效果都有两个子表:fromto,并且在这些表中,有几个属性来控制切换行为。

在继续之前,从本教程中获取一个表格打印函数(包括 print_r() 函数)会很有帮助。然后,假设您的项目中包含了 Composer 库和 utility.lua,请编写以下代码:

在终端/控制台中,您可以检查输出并了解每个效果的管理方式。让我们看一下最简单的情况:fade

在这种情况下,切换效果名为 fade(表中的第一个键)。它有两个子表:fromto。这两个表都有两个子参数:alphaStartalphaEnd。实际上,Composer 库会获取 alphaStart 值并将其设置为场景的 alpha 属性,然后告诉 transition.to() 将 alpha 更改为 alphaEnd 值。

一个更复杂的示例是 zoomOutInFadeRotate

在这种情况下,xScaleyScalexyrotationalpha 都设置了 StartEnd 值,就像第一个示例中的 alpha 一样。

自定义转场

如果您想更改这些值,您可以在调用 composer.gotoScene()composer.showOverlay() 之前的任何时间,通过简单地提供包含新值的适当表格来实现。 例如,如果您想使用 zoomOutInFadeRotate 将场景旋转三圈,只需将旋转值设置为 -1080 (3×-360)

请记住,这些值将一直有效,直到它们被显式重置、应用程序重新启动或您取消 require() Composer 库为止。

为了方便将来参考,可以在场景转场效果的 fromto 表中设置/更改的属性包括

  • xStart, xEnd
  • yStart, yEnd
  • alphaStart, alphaEnd
  • xScaleStart, xScaleEnd
  • yScaleStart, yScaleEnd
  • rotationStart, rotationEnd
  • transition

此外,还有一些可以在整个转场上设置的属性

  • hideOnOut — 在完成时隐藏之前的场景(对于由于动画而可能仍然位于顶部的场景)。
  • concurrent — 指定 tofrom 转场同时发生。
  • sceneAbove — 将新场景置于之前场景的上方。

例如,fadecrossFade 之间的唯一区别在于 crossFade 转场将 concurrent 设置为 true

调整转场缓动

您可能想要调整的另一件事是特定转场上的**缓动**,或者向没有缓动的场景转场效果添加缓动。 缓动允许转场基于多个预设选项以不同的方式表现(有关各种缓动算法的详细信息,请参阅 Corona 缓动 库)。

例如,如果您想在 fade 场景转场上应用缓动,请编写以下代码行

创建新的场景转场

与编辑现有场景转场效果类似,您也可以创建自己的转场效果。例如,您可以创建一个类似于 iOS 7 中看到的转场,其中原始场景和新场景以不同的速度转场,从而提供更有趣的动画效果

结论

通过编辑和添加到可访问的 effectsList 表,您可以更改 Composer 在转场场景时的行为方式。 但是,请小心您指定的值,因为不正确的值可能会导致您的场景仅部分移出屏幕、完全颠倒等等。 不过,通过一些实验——这些实验都不会永久损坏 Composer 库——您可以实现的有趣场景转场效果实际上没有限制。


Rob Miracle
[email protected]

Rob 是 Corona Labs 的开发人员关系经理。 除了热衷于帮助其他开发人员使用 Corona 制作精彩游戏外,他还喜欢在业余时间制作游戏。 Rob 从 1979 年起就开始编写游戏代码,从个人电脑到大型机。 他在游戏行业拥有超过 16 年的专业经验。

5 条评论
  • 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 日

    正是我需要的,谢谢!