将预先存在的项目从Flash 7 / AS2移动到Flex / AS3的最佳方法是什么?

时间:2008-09-05 16:04:37

标签: flex flash actionscript-3 porting

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

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

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

5 个答案:

答案 0 :(得分:6)

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

包命名

class your.package.YourClass
{
}

变为

package your.package
{
    class YourClass
    {
    }
}

需要进口

您必须明确导入所使用的任何外部类 - 通过其完全限定名称引用它们已经不够了。

接口方法不能标记为“public”

这是完全合理的,但AS2会允许你这样做,如果你有任何他们需要被删除。

明确的'覆盖'关键字

任何覆盖父类函数的函数都必须使用 override 关键字声明,就像C#一样。同样,如果你有扩展其他接口和重新声明函数的接口,那么必须删除那些覆盖(再次,与 public一样,这个符号无论如何都没有意义,但是AS2允许你这样做)。

所有Flash内置内容都已更改

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

结论

我没有完成这个转换到成功的工作,但我能在几个小时内编写一个快速的C#工具来处理这个问题的每个方面,除了覆盖关键词。自动化导入可能很棘手 - 在我的情况下,我们使用的软件包都以一些根级软件包开头,因此很容易检测到。

答案 1 :(得分:1)

首先,我希望您没有在项目中使用eval(),因为在AS3中没有等效项。

我要做的其中一件事是逐项检查Adobe's migration guide(基本上只是一个已更改内容的逐项列表),并试图找出是否可以通过简单的搜索更改每个项目替换操作(可能使用正则表达式)或者是否更容易手动编辑与AS3对应的事件。可能在很多情况下(特别是,正如你所说,要迁移的代码量非常高),你最好编写更改脚本(即使用正则表达式搜索和替换)并手动修复任何边界情况自动更改失败。

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

此外,正如其他人已经提到的那样,尝试将AS2 SWF与AS3 SWF结合起来并不是一个好主意,甚至不能正常工作,因此您必须立即迁移一个项目中的所有代码。

答案 2 :(得分:1)

以下是从AS2迁移到AS3的一些其他参考资料:

Grant Skinners介绍AS3 Workshop幻灯片 http://gskinner.com/talks/as3workshop/

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

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

迈克室

mesh@adobe.com

答案 3 :(得分:1)

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

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

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

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

对我来说最大的陷阱是涉及大量附加,复制和移动MovieClip,更改其深度等的部分。所有这些东西都无法真正重新构建,看起来像AS3;你必须将它们全部混合到更新的思维方式中,然后开始修复错误。

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

答案 4 :(得分:0)

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

从as2迁移 - > as3在知识方面相当简单。如果您知道面向对象as2,那么继续使用as3将不会成为问题。

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