几年前,我创建了一个小型的、简单的SWF,只为了在各种浏览器上播放MP3文件。我公开了接口,并从JavaScript调用它们。这一切都是简单明了的;您可以看到整个Guise.as源代码。
我使用mtasc编译了main类,它允许您为初始化代码指定一个主函数:
/**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类对象添加静态方法。这在非严格的模式下还有效吗?有什么问题吗?如果我将它转换为我的类中的一个正常方法,它会起作用吗?Function.prototype.bind=function()函数,这样当我有回调时,this将被正确设置。这个还能用吗?我可以在Function的原型中添加方法吗?positionTimeoutID=setTimeout(fireSoundPosition.bind(this), 1000)的东西,没有bind(this),那么Flash会将正确的this传递给我的回调方法吗?如有任何反馈,将不胜感激。我相信只有一两次小小的调整就会把整件事抛之脑后,但也许只要社区的一点帮助,我就不用花几天的时间阅读整本书,买新的SDK,只为了用几个新电话重新编译我的SWF .谢谢。
发布于 2012-01-18 18:09:30
我想我不能回答你所有的问题,但我会尝试提供一些答案:
ActionScript 3与ActionScript 2相比是一个很大的改变,它是一次彻底的架构大修,不仅仅是一次小的更新,也不是向后兼容的,因为没有重写,通常很难将非平凡的as2修改成as3。这就像一种全新的语言。所以最好退后一步,看看语言中发生了什么变化,因为它有很多变化。
最大的事情是形式化的类继承,而不是原型继承。
因此,当您从命令行编译时,给出了"main类“的路径:
mxmlc.exe "c:\dev\project\SomeClass.as"
SomeClass.as如下所示:
package {
import flash.display.Sprite;
public class SomeClass extends Sprite {}
}初始化时,flash将创建该类的实例并将其附加到舞台上。这将类似于AS2的_root概念。传递给-src的mxmlc.exe开关设置了支持此主类的其余类/包的路径。
因此,您的主类,无论您如何称呼它,都应该从Sprite继承。
是。“主类”的构造函数将是swf的入口点。
ActionScript 3类方法自动为定界方法,这与javascript是一个微妙的变化。事实上,在任何其他上下文中调用类方法都是不可能的(即使您使用.call()或.apply()试图强制进行上下文更改)。例如,使用这个简单的类
public class SomeClass {
public function Worker() {
alert(this);
}
}然后
var cls:SomeClass = new SomeClass();
cls.Worker();
var func:Function = cls.Worker;
func();
func.call(this);
func.apply(undefined);这四个函数调用将产生完全相同的结果,因为Worker()总是绑定到它来自的函数。
注意,这只适用于类方法,而不适用于匿名函数/闭包。所以..。
var func:Function = function():void { alert(this); }
func();
func.call(cls);
func.call(undefined);...are都不一样
这取决于,如果它是一个类方法,那么它将始终被绑定(参见最后一节)。如果闭包/匿名函数,那么是的,它仍然需要绑定到指定this。
你可能会想去拿闪存调试器。编译器应该随fdb一起运行,这是一个flash命令行调试器.这样做的想法是,当您在调试播放器中承载/运行应用程序时,可以将fdb附加到实例和trace(),以及设置断点并查看异常。
我将研究这个问题,尽管我认为“适当的”AS3解决方案将是从另一个类中创建一个静态方法来执行此操作,而不是直接扩展Array。类似于:
package {
public class ArrayHelpers {
public static From(object:Object):Array {
/* do work */
}
}
}然后将其称为:ArrayHelpers.From(whatever);
发布于 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。
哦,还有一种帮助调试的简单方法吗?只需回拨浏览器的日志记录例程,如下所示:
ExternalInterface.call("console.info", "Hello, world!");它就像一种魅力!哦,还有最后一件事:在代码开始时立即打开它,当您从JavaScript调用SWF时,异常将返回并显示在浏览器的调试器中(反之亦然)!
ExternalInterface.marshallExceptions = true;我花了一整天的时间被迫升级到ActionScript3、Flash10和Flex等等,当时我以为我只需要修改几行代码。现在我至少有了一些联系,这在很大程度上要感谢这里的反馈,明天我会回到这里,并试图找出为什么我无法播放WAV文件--这是这个练习开始的全部要点。
https://stackoverflow.com/questions/8914615
复制相似问题