【问题标题】:Loading external pngs into an AS2 swf that is loaded into an AS3 swf wrapper将外部 png 加载到加载到 AS3 swf 包装器中的 AS2 swf
【发布时间】:2010-05-20 15:03:16
【问题描述】:

我有一个加载一系列 AS2 电影的 Wrapper SWF。每个 AS2 电影都会加载一系列 .png 文件。

AS3_wrapper.swf
 |-> AS2_1.swf
      |-> image_1.png
      |-> image_2.png
 |-> AS2_2.swf
      |-> image_1.png
      |-> image_2.png

在 AS2 内部,我使用 onLoadInit 监听 png 的负载并更新我的 UI。

这适用于第一个 AS2 swf。但是当我加载第二个 AS2 swf 时,不会为 pngs 触发 onLoadInit。我的猜测是图像在缓存或类似的东西中。我在请求的末尾放了一个随机字符串以尝试避免缓存,但这似乎不起作用。

as2中的代码大致是这样的:

var flagLoader:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
listener.onLoadInit = Delegate.create(this, handleImageLoad);
flagLoader.addListener(listener);
var row:MovieClip = frame1["row" + (numLoaded + 1)];
flagLoader.loadClip(predictionData[numLoaded].flag + "?r="+Math.random(), row.flag);

我确保一次只加载一张图片(我读过轶事证据,一次加载不止一件东西会混淆MovieClipLoader)。对于第一个 as2 文件,一切正常。当我加载第二个 as2 文件时,handleImageLoad 永远不会被调用。

更新:更令人困惑的是,如果我重新加载第一个 AS2 电影(在第二个 AS2 电影无法加载图像之后),第一个 AS2 电影又可以正常加载图像。

更新 2:在尝试从使用 MovieClipLoader 更改为轮询(如有用的建议)后,我发现了更多相关的证据。

当我加载第一个 AS2 文件并从顶层剪辑跟踪时,它会打印出 _root。加载时的第二个 AS2 文件跟踪相同的 _root。这导致我检查他们是否在名称上发生冲突,并且确实如此。两人都有一个孩子叫frame。第一个,当我跟踪它时,它按预期显示为_root.frame。第二个 AS2 文件跟踪 _level0.instance3.instance118.instance111.frame。我猜这与问题有关。

Flash 保持两个文件的 _root 相同,但更改了其子文件的位置(对于随后加载的具有相同名称子文件的文件)。所以要么 onLoad 是去错误的剪辑,要么是关于它加载的事件。

【问题讨论】:

    标签: flash actionscript-3 actionscript actionscript-2


    【解决方案1】:

    每 3-4 年我遇到一次我认为最终会让我崩溃的问题......

    我在试图弄清楚为什么即使我成功地将 AVM1 电影加载到 AVM2 电影文件中,但 AVM1 文件没有按预期运行时遇到了这篇文章。

    解决了最初无法在 AS2 - AS3 文件之间通信的巨大问题后,当 AVM1 电影似乎总是在开始播放后不久就停止时,我简直不敢相信。

    对我来说,MovieClipLoader loadClip() 方法没有触发任何进度或完成的事件,因此导致我的文件完全停止播放,正如你们所建议的那样。

    您建议在 loadClip 调用后运行一个间隔来比较加载的字节数和总字节数对我有用。

    谢谢谢谢谢谢谢谢谢谢谢谢! :D

    【讨论】:

      【解决方案2】:

      在 AS3 下运行 AS2 似乎会引入一些延迟问题....您需要轮询加载的 swf 几次,然后才能识别它已加载。

      我处于类似的情况......一个 AS3 Shell 加载了一个大型而复杂的 AS2 应用程序,其中包含许多外部 swf、依赖项等。我必须做的是在 loadClip 调用之后运行一个间隔来比较加载的字节到字节总数......然后当它们彼此相等(但超过 4)时,我可以安全地触发 onLoadInit 函数,否则该函数永远不会触发。

      因此,您会丢失 MovieClipLoader 在 AS2 中为您提供的所有初始化、进度和错误事件。您将回到 FP5 和 FP6 天,但它似乎确实可以可靠地工作。很想听听其他人的经历以及是否有更好的解决方法。

      【讨论】:

      • 我会试一试,如果有效,请在这里报告。如果这是真的,那真的很糟糕,但我很感激有一个可能的解决方法。
      • 恐怕您的解决方案对我不起作用。但它确实帮助我找到了更多信息。也许你可以再看看我的描述并提供更多信息。
      【解决方案3】:

      詹姆斯,

      你是对的,我也注意到你描述的跟踪堆栈中的 _root 与 _level0.instance3.instance118 读取,它必须与 AVM1 内容以及 AVM2 电影如何处理它有关。

      轮询不会总是起作用,但您可以使用它来查看在触发 loadClip() 方法后发生了什么。你认为你的 bytesLoadedundefined 吗?或者,可能已加载 swf,但您无法访问它的属性,例如在 swf 的主时间轴上声明的变量。我已经深入研究了这个问题,发现基本上你有两种或三种解决这些问题的方法。轮询 AS2 容器是查看失败原因的第一步......

      您能否使用 loadMovie 而不是 MovieClipLoader 来加载您的 .png?

      您是否尝试过在 FP10.1 下运行您的示例?奇怪的是,很多这些问题都消失了!

      根据您的 AS2 应用程序的复杂性,这可能是一个难以解决的问题。

      你检查了这个: http://fladdict.net/blog-en/2007/06/avm2loader-class.html

      谢谢, 杰夫

      【讨论】:

      • 感谢杰夫的评论。我试过 loadMovie 而不是 MovieClipLoader,结果是一样的。如果我轮询 bytesLoaded 属性,它会返回 4 或一些奇怪的东西。我一直在使用最新的 10.1 播放器。我在网上找到了有关此问题的其他报告(一两个),但没有人有适合我的解决方法(大多数涉及以某种方式更改 as2 swf,这对我来说是不可能的)。
      最近更新 更多