6

我有一个针对 Flash 7 的大型代码库,其中包含很多AS2 类。我希望我能够将 Flex 用于任何新项目,但我们路线图中的许多新内容是对旧代码的补充。

AS2 和 AS3 的语法通常相同,所以我开始怀疑将当前代码库移植到 Flex/AS3 会有多难。我知道所有与 UI 相关的东西都是不确定的(目前 UI 是在运行时生成的,有很多 createEmptyMovieClip() 和 attachMovie() 东西),但 UI 和控制器/模型的东西大部分是分开的。

有没有人尝试将大量的 AS2 代码库移植到 AS3?有多难?你遇到了什么样的陷阱?对进行此类项目的方法有什么建议吗?

4

5 回答 5

6

在尝试将大量 AS2 类转换为 AS3 时,我看到了一些值得注意的问题:

包命名

class your.package.YourClass
{
}

变成

package your.package
{
    class YourClass
    {
    }
}

需要进口

您必须显式导入使用的任何外部类——仅通过它们的完全限定名称来引用它们已经不够了。

接口方法不能标记为“公共”

这是完全有道理的,但是 AS2 会让你这样做,所以如果你有任何它们需要被删除。

显式“覆盖”关键字

任何重写父类函数的函数都必须使用override关键字声明,这与 C# 非常相似。同样,如果您有扩展其他接口并重新声明函数的接口,则必须删除这些覆盖(同样,与public 一样,这种表示法无论如何都没有意义,但 AS2 允许您这样做)。

所有 Flash 内置的东西都改变了

您在上面提到了这一点,但例如,它现在是flash.display.MovieClip而不仅仅是MovieClip。这个类别有很多细节,我没有找到所有细节,但这里会有很多烦恼。

结论

我没有着手进行这种成功的转换,但我能够在几个小时内编写一个快速的 C# 工具来处理除override关键字之外的所有方面。自动导入可能会很棘手——在我的例子中,我们使用的包都以一些根级别的包开头,因此它们很容易被检测到。

于 2008-09-05T16:15:47.523 回答
1

首先,我希望你没有eval()在你的项目中使用,因为在 AS3 中没有等价物。

我要做的一件事是逐项阅读Adob​​e 的迁移指南(基本上只是一个已更改内容的逐项列表),并尝试确定是否可以通过简单的搜索和替换操作来更改每个项目(可能使用一个正则表达式)或者是否更容易手动编辑匹配项以对应于 AS3。可能在很多情况下(特别是如果,如您所说,要迁移的代码量非常高),您最好编写更改脚本(即使用正则表达式搜索和替换)并手动修复任何边界情况自动更改失败。

准备好留出一些时间进行一些调试和运行一些测试用例。

此外,正如其他人已经提到的那样,尝试将 AS2 SWF 与 AS3 SWF 结合起来并不是一个好主意,甚至根本行不通,因此您肯定必须一次将所有代码迁移到一个项目中。

于 2008-09-08T22:23:35.303 回答
1

以下是从 AS2 迁移到 AS3 的一些额外参考:

Grant Skinners 介绍性 AS3 研讨会幻灯片 http://gskinner.com/talks/as3workshop/

Lee Brimelow:学习 ActionScript 3 的 6 个理由 http://www.adobe.com/devnet/actionscript/articles/six_reasons_as3.html

Colin Moock:基本 ActionScript 3(被认为是 ActionScript 开发人员的“圣经”): http ://www.amazon.com/Essential-ActionScript-3-0/dp/0596526946

迈克室

网格@adobe.com

于 2008-09-15T22:18:07.380 回答
1

我的经验是,迁移到 AS3 的最佳方式是分两个阶段 - 第一个是结构,第二个是语法。

首先,在你留在 AS2 的地方进行几轮重构,但尽可能接近 AS3 架构。当然,这包括将所有框架脚本和#include 脚本移动到包和类中,但您可以做更微妙的事情,例如更改所有事件侦听器和调度程序以遵循 AS3 流程(使用事件类型的静态类属性,并通过方法注册而不是对象)。您还需要摆脱所有“内置”事件(例如 onEnterFrame),并且您需要仔细研究非平凡的鼠标交互(例如拖动)和键盘交互(例如检测是否一个键被按下)。这个阶段可以逐步完成。

第二阶段是从 AS2 转换为 AS3 - 将“_x”更改为“x”,以及所有 API,等等。这不能逐步完成,您必须一口气尽可能多地完成,然后开始修复所有编译错误。正因如此,你在第一阶段能做的越多,在第二阶段就能避免越多的痛苦。

这个过程对我来说是一个相当大的项目,但我应该注意,第一阶段需要对 AS3 的结构有深入的了解。如果您是 AS3 的新手,那么您可能需要尝试构建一些您需要移植的功能。例如,如果您的旧代码使用拖放目标,您将需要尝试在 AS3 中实现它,以了解您的代码必须如何在结构上进行更改。如果您考虑到这一点重构您的 AS2,最终的语法更改应该会顺利进行。

对我来说最大的陷阱是涉及大量附加、复制和移动电影剪辑、改变它们的深度等的部分。所有这些东西都不能真正重新架构成看起来像 AS3;您必须将其全部融合到更新的思维方式中,然后开始修复错误。

最后一点 - 我真的不会担心诸如 import 和 override 语句之类的东西,至少不会自动化它。如果你错过任何一个,它会被编译器捕获。但是,如果你错过了结构性问题,你将会有更多的痛苦。

于 2008-09-16T02:23:37.460 回答
0

从 as2 迁移像这样的更大项目将不仅仅是简单的搜索和替换。新语法非常相似且易于适应(如 lilserf 所述),但如果没有别的,as3 更严格,新事件模型很可能会导致很多问题。从头开始或多或少地重写几乎所有内容,可能会使用旧代码作为指导,您可能会更好。

不过,就知识而言,从 as2 -> as3 迁移相当简单。如果您了解面向对象的 as2,那么转向 as3 根本就不是问题。

除非您特别愿意,否则您仍然不必为您的 UI 使用 mxml。Mxml 只是提供了一种快速构建 UI(等)的方法,但是如果您想自己使用 actionscript 来完成,没有什么能阻止您(如果您已经在 as2 代码中拥有该 UI,这也可能会更容易)。Flex (Builder) 只是一种快速完成您可能不想自己做的事情的方法,例如构建 UI 和绑定数据,但本质上它只是为您创建 .swf 的一部分——它没有魔法;)

于 2008-09-12T02:49:05.233 回答