4

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

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

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

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

2. 一切按需加载

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

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

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

-

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

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

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

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

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

4

1 回答 1

5

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

1. 重用的 UI 元素只定义一次
根据重用的内容,这可以像定义库符号并使用它一样简单。无需通过搜索和替换进行挖掘即可替换字体,您也可以在“字体嵌入”菜单中简单地更换字体。

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

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

2. 一切都按需加载Flash 最保守的秘密之一是,使用时间轴和受过教育的编译器使用
非常容易完成。以下是它的工作原理:

如果您的 ActionScript 编译帧是大于 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。

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

于 2013-04-11T00:24:01.990 回答