Flash CS4 [embed]标签是否可以将资产导出到第2帧而不是第1帧?

时间:2010-01-10 23:12:56

标签: flash actionscript flash-cs4 embed

我们正在开发一个Flash CS4项目,其中主.fla文件的大小已经膨胀,'Publish'将永远消失。我怀疑大量的(并且至少有一些编译时间)是由于库中音频符号的数量造成的。

我希望从.fla文件中删除这种不必要的膨胀。我已尝试从库中删除音频符号并使用[embed]元数据标签,如下所示:

[Embed(source="audio/music/EndOfLevelDitty.mp3")]
public var EndOfLevelDitty:Class

生成的已发布文件完美无缺,但存在问题。我们的游戏在时间轴的第一帧使用预加载器,因此需要在第2帧中导出所有其他类(如发布设置> ActionScript 3.0设置中所设置)。所以尺寸报告通常是这样开始的:

Frame #    Frame Bytes    Total Bytes    Scene
-------    -----------    -----------    ----------------
      1         284515         284515    Scene 1
      2        5485305        5769820     (AS 3.0 Classes Export Frame)

但是,如果我在小声音上使用[embed]标签,我的尺寸报告现在是:

Frame #    Frame Bytes    Total Bytes    Scene
-------    -----------    -----------    ----------------
      1         363320         363320    Scene 1
      2        5407240        5770560     (AS 3.0 Classes Export Frame)

正如您所看到的,嵌入式声音已导出到第1帧而不是第2帧。如果我以这种方式嵌入所有声音,则第1帧的大小会变得很大,用户会看到在预加载器框架甚至加载之前的白色屏幕。

所以我的问题是:我可以使用[embed]代码但是在第2帧而不是第1帧中导出嵌入资产吗?

项目限制:

  • 我们的团队组成意味着我们无法在此阶段更改为纯Flex。
  • 编译后的.swf需要“一体化”,因此我们无法将预加载器拆分为单独的文件,也无法访问外部资源。

编辑:我也决定在嵌入式库SWC中​​使用音频,但似乎没有办法将其嵌入到第2帧中;它总是在第1帧结束。

3 个答案:

答案 0 :(得分:0)

为什么不简单地将资源放在您想要的框架中: 使用您的资产创建一个新类:

public class Assets extends Sprite {
 [Embed(source="audio/music/EndOfLevelDitty.mp3")]
 public var EndOfLevelDitty:Class;

 public function Assets() {
  super();
 }
} 

然后在flash IDE中创建一个新符号并使其扩展到Assets类,并将此符号放入您想要的框架中

答案 1 :(得分:0)

我喜欢帕特里克的答案,听起来应该有效。

您可能还会考虑在不同的.swf中编写预加载器 - 这很简单,您可以避免所有的frame1 / frame2废话。 :)

答案 2 :(得分:0)

最后我只是厌倦了Flash中的所有混乱,并决定在Flex中构建预加载器(仅),将游戏SWF嵌入到预加载器中并使用SWFLoader加载它。 (这是基于Myk的建议。)最后我仍然有一个SWF,Flex的更强大的预加载系统处理预加载器显示。

我最终没有使用完整的Flex Builder;我刚从免费的Flex SDK中使用mxmlc编译了Flex的东西。

这是我的mxml文件(我真的不知道我在用mxml做什么,所以请有人告诉我这种方法是否错误):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" preloader="CustomPreloader" width="755" height="500" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#000000, #000000]" frameRate="30">
<mx:SWFLoader source="@Embed(source='../../trunk/Game.swf')" width="755" height="500" x="0" scaleContent="false" y="0"/>
</mx:Application>

CustomPreloader是一个扩展mx.preloaders.DownloadProgressBar的简单类。)

我喜欢这种方法,我现在可以在Flash方面做任何我喜欢的事情;我可以不再担心导出的帧类了。

我担心的一个问题是游戏现在似乎运行得稍慢。使用SWFLoader时是否存在性能问题?有更快的替代方案吗?