带有嵌入bytearray的SWF预加载器

时间:2011-03-27 20:12:03

标签: flash actionscript-3 bytearray preloader

在整个SWF完全加载之前,编译的SWF未显示预加载器。任何人都会非常感激,我用谷歌搜索整晚都找不到任何东西,至少对我而言。

2 个答案:

答案 0 :(得分:5)

您无法将ByteArray嵌入到主文档类中,因为从文档类引用的类将自动包含在第1帧中。

预加载资产的最佳方法是拥有一个单独的Preloader类和Main类。您希望Preloader类在第1帧导出,主要类和资产在第2帧导出。

不幸的是,这比它应该更复杂,但是你可以这样做:将你的文档类设置为Preloader。此类包含您的loaderInfo代码。但是,当您完成加载时,不直接实例化Main ,即不执行var main:Main = new Main()。无论你做什么,这都会自动将Main编译到第1帧。相反,间接实例化它,如下所示:

nextFrame(); // you sometimes need to do this for the player to register classes exported on frame 2
var mainClass:Class = flash.utils.getDefinitionByName("Main") as Class;
var main:Sprite = new mainClass();
addChild(main);

这将阻止编译器自动将Main拖到第1帧上。

接下来,如果您使用的是Flash CS3 + IDE,请转到文件 - >发布设置 - > Flash-> ActionScript 3.0设置,然后将“将帧上的类导出”设置更改为第2帧。然后,在框架上2,你的电影,放置一个空的MovieClip。在此MovieClip中,通过输入以下代码来放置对Main类的引用:var dummy:Main;。你必须这样做的原因是编译器仍然知道你正在使用Main,所以它实际上会将它编译成电影,否则它根本不会编译它。您也不希望将其放在主时间轴上,因为主时间轴上的任何代码引用都会自动被拖到第1帧上。

在IDE中,检查事物是否已在适当位置导出的有用技巧是检查“发布属性” - >“Flash”中的“生成大小报告”。您可以检查报告,并且很容易注意到垃圾是否已导出到第1帧。

如果您使用的是Flash Builder,FlashDevelop或FDT,则该过程基本相同 - 创建单独的Preloader和Main类,并从Preloader间接实例化Main。但要通知编译器在Preloader之后的一个帧上编译Main,请将此metatag放在public class Main中的Main.as之上:

[Frame(factoryClass="Preloader")]

FlashDevelop还可以通过单击“项目”选项卡中的旁边的+来反省SWF文件。它将显示哪些资产已导出到哪些框架。理想情况下,您只需要在第1帧上使用最少的Preloader。

答案 1 :(得分:0)

我在CS4中测试了Mike的方法。显然,引用Main的虚拟影片剪辑不需要位于第2帧,也不需要位于时间轴上的任何位置。只要虚拟影片剪辑设置为在第2帧导出,Main将在第2帧导出,因为它在虚拟剪辑的代码中引用。