2012-04-23 2 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"); 

는 I는 클립을로드하는 동안 모든 것을 음소거로 간주하지만,이 소리를 재생할 수있는 경우에 대한 프로그램의 나머지 부분에 매우 심각한 제약을 배치했습니다.

이 문제의 표준 해결책이 있습니까? 매우 일반적인 문제인 것처럼 느껴집니다.

답변

3

SWF가 웹 서버에 있기 때문에 미리로드 중입니까? 그렇다면 한 가지 옵션은 URLLoader을 사용하여 실제로 해석하지 않고 서버에서 바이트를 미리로드하는 것입니다. 그런 다음 나중에 MovieClip을 표시해야하는 경우 Loader.loadBytes을 사용하여 미리로드 된 바이트 (URLLoader.data)를 Loader에 삽입하여 MovieClip을 실제로 인스턴스화하고 재생, 사운드 및 모든 것을 시작합니다. 인스턴스 생성시 약간의 지연이있을 수 있지만 프리 로더가없는 경우보다 훨씬 적습니다. 이 같은 함수 클로저와 함께 이벤트 리스너를 추가하지 마십시오, 그것은 원인이됩니다 메모리 -이 단지 실증 코드 :

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); 

    } 
    } 
} 

(참고 : loader.content의 유형에 대한 질문 당

누설도 있습니다. URLLoader를 건너 뛰고 내 바이트를 가져 오기 위해 단순히 임베드 할 수도 있지만 두 바이트는 같은 바이트입니다.

그리고 출력은 다음과 같습니다

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

그러나, 비트 맵 및 무비 클립은 loader.content을위한 유일한 옵션이 없습니다 - 코드에서 컴파일 된 SWF를로드 스프라이트에서 파생 될 수 있으며, 정규화 된 클래스를 표시 할 수 있습니다 이름은 www0z0k에서 지적했듯이, 모두 DisplayObject에서 파생됩니다. Flash Professional의 SWF 출력은 항상 MovieClip에서 파생됩니다. 로더 바이트는 항상 당신이 옳은 것 밝혀

무비 클립 것을 메모 당

- 정규 이전 이미지를로드하는 로더는 contentLoaderInfo.bytes 속성은 생성 된 SWF의 바이트를 포함 이미지가 Child 인 간단한 MovieClip 래퍼입니다. 누가 짐작 했 겠어?!

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

이 내가 찾던 물건의 종류는 정확히이다. –

+0

관련 문제 : 개체를 실제로로드하지 않으면 이미지로 간주되는지를 결정하는 가장 좋은 방법은 무엇입니까? 과거에는 이미지 데이터의 바이트 배열을로드하면 무비 클립이 생성된다는 것을 알았습니다. –

+0

정확하게 귀하의 질문을 이해할 수 있을지 모르겠지만, Loader.loadBytes를 사용하면 귀하는 Event.COMPLETE를 받게됩니다.내용은 Bitmap (바이트가 JPEG 또는 PNG 인 경우) 또는 MovieClip (바이트가 SWF 인 경우) 중 하나 여야하므로 상호 작용할 수 있는지 여부를 알 수 있습니다 (중지/재생). –