2012-04-23 56 views
2

我正在AS3中编写一个程序,并且要预先加载将来需要的影片剪辑。不幸的是,我遇到了一个问题:电影剪辑一载入就会播放声音(在将它们添加到舞台之前)。我如何静静地预加载有声音的影片剪辑?

加载后立即停止影片剪辑差不多解决了这个问题,但有时我仍然听到剪辑的开始。显然,剪辑不会等待完成的事件处理程序在开始之前完成...?

// example of stopping a clip after it is loaded 
// sound may still be heard for a moment 
var loader: Loader = new Loader(); 
loader.addEventListener(Event.COMPLETE, function(e : *) : void { 
    (loader.contentLoaderInfo.content as MovieClip).stop(); 
}); 
loader.load("a_loud_movie_clip.swf"); 

我也考虑静音一切,而加载的剪辑,但这个地方一个相当严重的约束与尊重程序的其他部分时,声音可以发挥到。

有没有解决这个问题的标准方案?我觉得这应该是一个非常普遍的问题。

回答

3

因为您的SWF位于Web服务器上,您是否预加载?如果是这样,则一种选择是从服务器预加载字节,而不使用URLLoader实际解释它们。然后,当您需要显示MovieClip时,使用Loader.loadBytes将预加载的字节(URLLoader.data)注入Loader以实际实例化MovieClip(并开始播放,声音和全部)。实例化时可能会有一点滞后,但比没有预加载器要少得多。

根据您对loader.content类型的问题:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Loader; 
    import flash.display.Bitmap; 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.utils.ByteArray; 
    import flash.utils.getQualifiedClassName; 

    public class tst extends Sprite 
    { 
    [Embed(source="any_image.png", mimeType="application/octet-stream")] 
     private var img_bytes:Class; 

    [Embed(source="any_swf.swf", mimeType="application/octet-stream")] 
     private var swf_bytes:Class; 


    public function tst():void 
    { 
     var b1:ByteArray = new img_bytes(); 
     var l1:Loader = new Loader(); 
     l1.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
     trace(getQualifiedClassName(l1.content)); 
     trace(l1.content is Bitmap); 
     }); 
     l1.loadBytes(b1); 

     var b2:ByteArray = new swf_bytes(); 
     var l2:Loader = new Loader(); 
     l2.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
     trace(getQualifiedClassName(l2.content)); 
     trace(l2.content is MovieClip); 
     }); 
     l2.loadBytes(b2); 

    } 
    } 
} 

(注意:这仅仅是示范代码 - 切勿用函数闭包这样的添加事件侦听器,就会造成内存泄漏,我也跳过URLLoader,并简单地嵌入来获取我的字节,但它们是相同的字节)。

,输出是:

flash.display::Bitmap 
true 
test_fla::MainTimeline 
true 

然而,位图和影片剪辑是不是loader.content唯一的选择 - 从加载代码编译的SWF可以从雪碧中导出,并且可以显示完整的类名称,尽管www0z0k指出,它们都是从DisplayObject派生的。尽管我相信Flash Professional的任何SWF输出都始自MovieClip。

根据您的注意,装载机字节始终是影片剪辑

事实证明你是对的 - 加载一个普通的旧图像的加载器,contentLoaderInfo.bytes属性包含生成的SWF是字节一个简单的MovieClip包装器,其图像为Child。谁会猜到?!

var l3:Loader = new Loader(); 
    l3.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
    trace("- l3:"); 
    trace(getQualifiedClassName(l3.content)); 
    trace(l3.content is Bitmap); 

    // This ByteArray is a SWF! 
    var b3:ByteArray = l3.contentLoaderInfo.bytes; 

    var l4:Loader = new Loader(); 
    l4.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
     trace("- l4:"); 
     trace(getQualifiedClassName(l4.content)); 
     trace(l4.content is Bitmap); 
     trace(Object(l4.content).getChildAt(0) is Bitmap); 
    }); 
    l4.loadBytes(b3); 
    addChild(l4); 

    }); 
    l3.load(new URLRequest("any_image.png")); 

输出是:

- l3: 
flash.display::Bitmap 
true 
- l4: 
flash.display::MovieClip 
false 
true 
+0

这正是诸如此类的事情,我一直在寻找。 – 2012-04-23 18:20:12

+0

相关问题:如果我实际上没有加载对象,那么确定它是否应该是图像的最佳方法是什么?我注意到过去加载一个图像数据的字节数组会产生一个影片剪辑。 – 2012-04-23 18:23:56

+0

我不确定我是否完全理解你的问题,但是你在使用Loader.loadBytes后会得到一个Event.COMPLETE,在这个时候Loader。内容应该是位图(例如,如果字节是JPEG或PNG)或MovieClip(如果字节是SWF),那么您应该知道您是否可以与它进行交互(停止/播放)。 – 2012-04-23 20:31:48