大型 Flash/AS3 项目的工作流程

Posted

技术标签:

【中文标题】大型 Flash/AS3 项目的工作流程【英文标题】:Workflow for Large Flash/AS3 Projects 【发布时间】:2013-04-02 18:50:34 【问题描述】:

我目前正在开发一个相当大的、大量 UI 的 Flash 游戏。我们的团队已经为此工作了大约 9 个月。我们之前都没有任何使用 Flash 的经验,因此我们在此期间不断改进我们的工作流程。但是,我们仍然觉得我们现在做的不是最优的,尤其是程序员和艺术家之间的界面,所以我想知道其他团队是如何工作的。

理想的工作流程应满足以下要求:

1.重复使用的 UI 元素只定义一次

这意味着,如果我们想要更改字体或按钮样式,我们不想遍历所有菜单并手动更改它们。我们希望它们在一个中心位置定义,并且只从那里引用。如果资源不仅在编辑时共享,而且在运行时共享(即它们只下载一次),则会获得奖励积分。

2。一切都按需加载

目前,我们有两个不同的加载步骤:首先,我们加载菜单库。完成后,玩家已经可以与所有菜单进行交互。然后,我们开始加载实际的游戏数据。但是,初始加载时间仍然太长,导致我们失去了许多潜在玩家。我们真正想做的是只加载主菜单所需的最低限度的内容,然后仅在玩家尝试实际打开相应菜单时加载其他所有内容。 Zuma Blitz 做得很好。

3.艺术家可以在没有程序员帮助的情况下进行微小的更改

如果要在不改变实际功能的情况下重新设计菜单,艺术家应该可以在 Flash CS6 中自行完成。这需要美术和代码之间有一个清晰的界面,并且美术应该可以在将更改发送给编码人员之前对其进行测试和调试。

-

我们当前的工作流程如下所示:艺术家在 Flash CS6 中将屏幕构建为 MovieClip,然后将其导出为 SWF。在代码方面,从屏幕 SWF 加载 MovieClip,并将它们用作我们基于 PureMVC 的系统中的 View 类。中介者通过它们的实例名称访问视图中的文本字段等元素。

这很容易出错,因为没有定义接口的中心位置(即实例名称)。编码员和艺术家之间需要大量的通信开销。此外,它还会在代码和影片剪辑的内部结构之间创建依赖关系。当艺术家想要对其应用某些效果时,他们不能将文本字段附加到不同的子影片剪辑。

我们正在试验一种基于事件的界面,该界面需要艺术家向影片剪辑添加几行代码。这比以前更不容易出错和相互依赖,但它仍然不能完全满足(3),除非我们编写额外的测试和调试工具。这一定是一个普遍的问题,我很难想象没有更简单的方法。

对于 (2),我们还开始构建一个自制的解决方案,但同样,这是一项非常常见的任务,必须已经有一些我们可以使用的东西。

那么,经验丰富的 Flash 开发人员如何管理如此大的项目?

【问题讨论】:

我认为这个问题也许更适合 Programmers Stack Exchange 站点,因为它似乎与一般开发有关,而不仅仅是代码。这并不是说你不会在这里得到有用的答案,只是得到它们的机会可能没有那么高。 仅供参考,我在 gamedev 上发布了类似的问题:gamedev.stackexchange.com/questions/40238/… 我们决定通过将所有菜单放入一个 FLA 来处理 (1)。这意味着一次只能有一位艺术家可以使用它,但在我们目前的团队规模下,这还可以。所有位图、声音和其他更大的资源都将按需加载。由于似乎确实没有现成的解决方案来满足我们的需求,因此我们需要构建自己的工具来加载和让艺术家自己调试屏幕。 【参考方案1】:

我有一些想法,但它们是基于我独特的编码风格。

1.重复使用的 UI 元素只定义一次 根据您正在重用的 what,这可以像定义库符号并使用它一样简单。字体可以在不挖掘的情况下通过搜索和替换来替换,您也可以在“字体嵌入”菜单中简单地更换字体。

对于跨 xfl 的共享,您可以使用 Flash Pro Project。请记住,这涉及到一定的时间开销(文件在您打开或保存文件时需要更新,Flash 在项目中崩溃更多,尝试处理来自同一项目)。

有些人使用 swcs,但这样做需要您在代码中实例化其中的内容,这可能不适用于您的工作流程。我仅将它们用于音频,并且我发现其中的对象必须在您指定为 AS 编译帧的帧上或之前进行编译,否则无法正确实例化声音。我怀疑从 swc 实例化的任何东西都会出现这种情况。

2。一切都按需加载 Flash 最保守的秘密之一是,使用时间线 和经过培训的编译器使用可以很容易地完成。以下是它的工作原理:

如果您的 ActionScript 编译帧是大于 1 的帧,那么编译的方式如下:

在第 1 帧之前: 第 1 帧使用的任何视觉资产和嵌入的声音 您的主文档类,以及直接从文档类引用的任何类(这是编写接口的一个很好的理由) 在您的 AS 编译框架 (N) 之前: 您的 AS 类(代码,不一定是视觉/音频资产) 任何库符号的视觉和音频资产在帧 N 中设置为 Export for AS(即使它们未在 swf 中使用) 在时间轴上首次使用资产的帧之前: 所有库符号中的视觉/音频资产,其中在框架 N 中为 AS 导出选中。

如果您在第 1 帧上放置了一个微调器加载图形,并且您选择了第 10 帧作为导出帧,那么如果您只是让影片播放直到它到达第 10 帧,那么它的加载方式如下:

如果您的微调器中有任何重资产或在主文档类中直接引用,则用户在下载这些内容时会看到一个空白屏幕 微调器将变得可见并旋转 加载 AS 类后,连同在第 10 帧中设置为导出的库符号和实际在第 10 帧的资产,您将看到这些资产以及您需要的一切使用它们就可以了。 swf 的其余部分将继续在后台加载,更新framesLoaded

实际上,我对第 10 帧上的对象使用了一个 setter 的组合,加上一个 ENTER_FRAME 处理程序来检查我们是否在第 10 帧上。有些事情我必须做的事情会更容易一些,而另一些事情则可以更好地做另一种方式。

3。艺术家可以在没有编码人员帮助的情况下进行微小的更改 如果代码都在库符号的基类中,艺术家不需要理解它,只要他们不删除或更改所需的实例名称即可。我尝试通过观看ADDED_TO_STAGE(捕获阶段)并按类型观看显示对象来尽量减少对实例名称的依赖。一旦我引用了适当类型的对象,就很容易在该对象上观察REMOVED_FROM_STAGE 以取消引用它。这类似于 RobotLegs 和 Swiz 等框架的工作方式。

此外,我使用了一个我称之为“语义闪存”的概念,我在其中做了很多基于标签的工作。我有一个基类 FrameLabelCip,它具有内置的 nextLabel() 和 previousLabel() 功能,以及调度 FRAME_LABEL_CONSTRUCTED 事件。从故事板事件名称到 Flash 标签名称真的很容易,只需构建 bang-bang-bang 图形。

我大量使用Graphic Symbols 来跨多个标签(例如,项目符号列表)同步图形,而不是依赖代码。这个动画师的技巧使这些东西既健壮又易于技术含量较低的队友使用。

【讨论】:

您的预加载技术只适用于主 SWF,不是吗?我们有许多动态加载的 SWF,当前加载在初始加载屏幕中。玩家必须在加载屏幕中等待,直到所有菜单库都加载完毕。相反,我们想要的是仅加载最低限度的内容以显示主菜单并按需加载每个子菜单,并显示加载图标,直到屏幕准备好。 Flash 中似乎没有现成的解决方案,对吧?我想确保我不会浪费时间写一些已经存在的东西。 在我看来,您的目标是让这些菜单快速启动并运行。之后,您可以随心所欲地处理动态部分。 MPE 是,通过适当的规划,资产的动态需求比人们想象的要少。例如,只要使数据动态化,就可以处理很多动态的东西。 您可能需要查看this 以了解真正需要动态加载的部分。 谢谢,看起来不错。您的答案并不完全是我们想要的,但在与其他几位开发人员交谈后,我们想要的工具似乎真的不存在。不过,你给了我们一些非常好的建议,所以我会接受这个答案。

以上是关于大型 Flash/AS3 项目的工作流程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 flash(as3) 中检测实例来自哪个类

单击时尝试转换按钮颜色 flash as3

登录屏幕的 Flash AS3 错误 #2101

Flash / AS3 ...设计人员如何修改以编程方式添加的控件?

Flash AS3 自定义颜色频闪动画

浏览器 (html) 中的 Flash AS3 调试动画?