首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ActionScript 2 mtasc迁移到Flex mxmlc

从ActionScript 2 mtasc迁移到Flex mxmlc
EN

Stack Overflow用户
提问于 2012-01-18 17:34:25
回答 2查看 530关注 0票数 1

几年前,我创建了一个小型的、简单的SWF,只为了在各种浏览器上播放MP3文件。我公开了接口,并从JavaScript调用它们。这一切都是简单明了的;您可以看到整个Guise.as源代码。

我使用mtasc编译了main类,它允许您为初始化代码指定一个主函数:

代码语言:javascript
复制
/**Main entry point.*/
static function main(mc)
{

在我想要添加WAV支持之前,它一直工作得很好。Flash本机不支持WAV,所以我尝试添加一个图书馆。但是这个库需要Flash10,不能在mtasc上编译,所以我下载了Flex4.6并尝试使用mxmlc。天哪,我的痛苦才刚刚开始。

我编译的SWF不再起作用了-甚至对MP3文件也是如此。我不知道从哪里开始找出问题,但我知道我有很多问题没有答案--也许其中之一就是我的问题

  • 如果我正确理解,mxmlc没有“主入口点”的概念,但是只会创建一个“主类”的实例,不管它是什么。但是如何指定主类呢?如果我在命令行上使用mxmlc引用我的类,该类会自动成为主类,还是绝对需要我的类位于根包(即no中)?一定要有个特别的名字吗?
  • 在我成功地指定了一个主类之后,我是否可以简单地将我的入口点代码移到主类的构造函数中?
  • 在我的原始类中,我添加了一个全局函数来使用Array.from=function(object:Object)将一个对象转换为一个数组。在我处于严格模式时,这给了我一个错误--显然是因为它不喜欢我向Array类对象添加静态方法。这在非严格的模式下还有效吗?有什么问题吗?如果我将它转换为我的类中的一个正常方法,它会起作用吗?
  • 由于我习惯于在"real“JavaScript中这样做,我添加了一个Function.prototype.bind=function()函数,这样当我有回调时,this将被正确设置。这个还能用吗?我可以在Function的原型中添加方法吗?
  • 我还需要绑定上下文吗?如果我调用类似于positionTimeoutID=setTimeout(fireSoundPosition.bind(this), 1000)的东西,没有bind(this),那么Flash会将正确的this传递给我的回调方法吗?
  • Flex编译器抱怨说有几个API方法已经改变了,所以也许修改我的调用改变了一些东西,而且我不理解新的API。有任何方法来调试这个SWF吗?写到浏览器控制台?嘟嘟一声?什么都行?而不需要从Adobe或其他地方购买一些大型IDE吗?

如有任何反馈,将不胜感激。我相信只有一两次小小的调整就会把整件事抛之脑后,但也许只要社区的一点帮助,我就不用花几天的时间阅读整本书,买新的SDK,只为了用几个新电话重新编译我的SWF .谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-18 18:09:30

我想我不能回答你所有的问题,但我会尝试提供一些答案:

ActionScript 3与ActionScript 2相比是一个很大的改变,它是一次彻底的架构大修,不仅仅是一次小的更新,也不是向后兼容的,因为没有重写,通常很难将非平凡的as2修改成as3。这就像一种全新的语言。所以最好退后一步,看看语言中发生了什么变化,因为它有很多变化。

最大的事情是形式化的类继承,而不是原型继承。

  • "Flash“将简单地创建一个”主类“的实例,不管它是什么。

因此,当您从命令行编译时,给出了"main类“的路径:

mxmlc.exe "c:\dev\project\SomeClass.as"

SomeClass.as如下所示:

代码语言:javascript
复制
package {
    import flash.display.Sprite;
    public class SomeClass extends Sprite {}
}

初始化时,flash将创建该类的实例并将其附加到舞台上。这将类似于AS2的_root概念。传递给-srcmxmlc.exe开关设置了支持此主类的其余类/包的路径。

因此,您的主类,无论您如何称呼它,都应该从Sprite继承。

  • 在我成功地指定了一个主类之后,我可以简单地将我的入口点代码移动到主类的构造函数中吗?

是。“主类”的构造函数将是swf的入口点。

  • “正如我习惯于在”真实“JavaScript中所做的那样,我添加了一个Function.prototype.bind=function()函数,这样当我有回调时,它将被正确地设置。这还能工作吗?我能把方法添加到函数的原型中吗?”

ActionScript 3类方法自动为定界方法,这与javascript是一个微妙的变化。事实上,在任何其他上下文中调用类方法都是不可能的(即使您使用.call().apply()试图强制进行上下文更改)。例如,使用这个简单的类

代码语言:javascript
复制
public class SomeClass {
    public function Worker() {
        alert(this);
    }
}

然后

代码语言:javascript
复制
var cls:SomeClass = new SomeClass();

cls.Worker();
var func:Function = cls.Worker;
func();
func.call(this);
func.apply(undefined);

这四个函数调用将产生完全相同的结果,因为Worker()总是绑定到它来自的函数。

注意,这只适用于类方法,而不适用于匿名函数/闭包。所以..。

代码语言:javascript
复制
var func:Function = function():void { alert(this); }
func();
func.call(cls);
func.call(undefined);

...are都不一样

  • “我是否还需要绑定上下文?如果我调用类似于bind 1000的东西,如果没有bind(此),会将正确的内容传递给我的回调方法吗?”?

这取决于,如果它是一个类方法,那么它将始终被绑定(参见最后一节)。如果闭包/匿名函数,那么是的,它仍然需要绑定到指定this

  • Flex编译器抱怨说,有几个API方法发生了变化,所以可能修改我的调用改变了一些东西,而且我不理解新的API。有任何方法来调试这个SWF吗?写到浏览器控制台?嘟嘟一声?什么都行?而不从Adobe或其他地方购买一些大的IDE?

你可能会想去拿闪存调试器。编译器应该随fdb一起运行,这是一个flash命令行调试器.这样做的想法是,当您在调试播放器中承载/运行应用程序时,可以将fdb附加到实例和trace(),以及设置断点并查看异常。

  • 在我的原始类中,添加了一个全局函数来使用Array.from=function( object :Object)将对象转换为数组。当我处于严格模式时,这给了我一个错误--显然是因为它不喜欢我向Array类对象添加静态方法。这在非严格的模式下还有效吗?有什么问题吗?如果我将它转换为类上的一个正常方法,它会工作吗?

我将研究这个问题,尽管我认为“适当的”AS3解决方案将是从另一个类中创建一个静态方法来执行此操作,而不是直接扩展Array。类似于:

代码语言:javascript
复制
package {

    public class ArrayHelpers {
        public static From(object:Object):Array {
            /* do work */
        }
    }

}

然后将其称为:ArrayHelpers.From(whatever);

票数 2
EN

Stack Overflow用户

发布于 2012-01-19 02:43:58

感谢32位小朋友的全面回应。我终于开始工作了。为了回答剩下的问题,下面是我在这漫长的一天实验中的一些经验。

首先,要获得一个主类,只需在mxmlc命令行上指示该类。类不必在根包中。将启动内容放入类构造函数中。哦,从其他网站上看,这个类可能需要扩展Sprite或电影剪辑。

没有任何绑定的东西是需要的,正如32位工具包所指出的。但是要小心--自Flash9以来,API的大部分已经发生了变化。例如,ExternalInterface.call()现在只使用两个参数,因为您不再需要传递上下文(例如this)了。声音API已经完全改变了。

试图定义Array.from()可能不起作用。(在扔掉我不再需要的Function.prototype.bind()之后,我就不需要了。)试图增强现有类(如添加String.prototype.endsWith() )似乎也不起作用。

但是,也许我发现的关于调试SWF的最重要的事情,最终让我发现了问题是非常重要的:下载调试ActiveX闪存播放器并为IE安装它。(我只推荐IE版本,因为这个练习的目的是让WAV文件在IE上播放--这是唯一不支持WAV文件的主要浏览器。)发牢骚)说真的,调试Flash播放器是非常宝贵的。独立调试播放器不支持ExternalInterface

哦,还有一种帮助调试的简单方法吗?只需回拨浏览器的日志记录例程,如下所示:

代码语言:javascript
复制
ExternalInterface.call("console.info", "Hello, world!");

它就像一种魅力!哦,还有最后一件事:在代码开始时立即打开它,当您从JavaScript调用SWF时,异常将返回并显示在浏览器的调试器中(反之亦然)!

代码语言:javascript
复制
ExternalInterface.marshallExceptions = true;

我花了一整天的时间被迫升级到ActionScript3、Flash10和Flex等等,当时我以为我只需要修改几行代码。现在我至少有了一些联系,这在很大程度上要感谢这里的反馈,明天我会回到这里,并试图找出为什么我无法播放WAV文件--这是这个练习开始的全部要点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8914615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档