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

时间:2013-04-10 18:58:06

标签: actionscript-3 flash user-interface workflow flash-cs6

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

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

1。重用的UI元素只定义一次

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

2。一切都按需加载

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

第3。没有编码员的帮助,艺术家可以进行微小的改变

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

-

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

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

我们正在尝试使用基于事件的界面,该界面要求艺术家在动画片段中添加几行代码。这比以前更不易出错且相互依赖,但除非我们编写额外的测试和调试工具,否则它仍然不能完全满足(3)。这一定是一个常见的问题,我很难想象没有更简单的方法。

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

那么,有经验的Flash开发人员如何管理这么大的项目呢?

1 个答案:

答案 0 :(得分:5)

我有一些想法,但它们是基于我的编码风格,这对我来说是独一无二的。

<强> 1。重用的UI元素只定义一次
根据您正在重复使用的 ,这可以像定义库符号并使用它一样简单。可以在不进行搜索和替换的情况下替换字体,也可以在字体嵌入菜单中简单地换出字体。

要在xfl中共享,您可以使用Flash Pro Project。请记住,这涉及到一定的时间开销(文件在打开或保存时需要更新,Flash会因为项目而崩溃,尝试处理来自的两个文件可能是个坏主意。同一个项目)。

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

<强> 2。一切都按需加载
Flash中保存最好的秘密之一就是使用时间轴和受过教育的编译器使用很容易实现。以下是它的工作原理:

如果你的ActionScript编译框架是一个大于1的框架,那么这就是编译的方式:

  • 第1帧之前:
    • 第1帧上使用的任何视觉资产和嵌入式声音
    • 您的主要文档类,以及直接从文档类引用的任何类(这是编写接口的好理由)
  • 在AS编译框架(N)之前:
    • 您的AS类(代码,不一定是视觉/音频资产)
    • 在第N帧中设置为“导出为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来跨多个标签同步图形(例如,项目符号列表),而不是依赖代码。这个动画师的诀窍使得这些东西既不稳固又容易接近技术不太好的队友。