2009-08-15 1 views
0

でローダーから特定のオブジェクトを取得する:私は、ActionScript 3.0を学んでいると私は、多くの場合、このパラダイムを見ていますActionScript 3.0の

package util 
{ 
    import flash.display.Sprite; 
    import flash.display.Bitmap; 
    import flash.display.Loader; 
    import flash.display.LoaderInfo; 
    import flash.net.URLRequest; 
    import flash.events.Event; 

    public class BitmapLoader extends Sprite 
    { 
     private var loader:Loader = new Loader(); 

     private var filePath:String; 

     public function BitmapLoader(filePath) 
     { 
      this.filePath = filePath; 

      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListener); 
     } 

     public function load():void 
     { 
      loader.load(new URLRequest(filePath)); 
     } 

     private function completeListener(event:Event):void 
     { 
      addChild(loader); 
     } 
    } 
} 

私が行うことができるようにしたいと思い何をして戻ってその御馳走ではなく、オブジェクトを取得することですローダーはDisplayObjectです。理想化されたバージョンを私が何をしたいのかを説明するのに最適な形で投稿します。

package util 
{ 
    import flash.display.Bitmap; 
    import flash.display.Loader; 
    import flash.display.LoaderInfo; 
    import flash.net.URLRequest; 
    import flash.events.Event; 

    public class BitmapLoader 
    { 
     private var hasLoaded:Boolean = false; 
     private var loader:Loader = new Loader(); 

     private var filePath:String; 
     private var bitmap:Bitmap; 

     public function BitmapLoader(filePath) 
     { 
      this.filePath = filePath; 

      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListener); 
     } 

     public function load():Bitmap 
     { 
      loader.load(new URLRequest(filePath)); 

      while(!hasLoaded); 

      return bitmap; 
     } 

     private function completeListener(event:Event):void 
     { 
      bitmap = new Bitmap(Bitmap(LoaderInfo(event.target).content).bitmapData); 
      hasLoaded = true; 
     } 
    } 
} 

私が紛失しているのは、whileループが終了しない理由です。とにかく、これは私が達成したいものなので、私の例を修正したり、好きな方法を投稿したりしてください。ありがとう!

答えて

1

これは不適切です:

bitmap = new Bitmap(Bitmap(LoaderInfo(event.target).content).bitmapData); 

これは、(この例では新しいの欠如に気づく)が適当である:

bitmap = Bitmap(loader.content); 

whileループの面では、あなたはフラッシュを凍結していますそのラインのプレーヤー。 Flashはシングルスレッドで、while節の後に発生するすべてのイベントは起こりません。それはループを中断するのを待っています。ループを中断するための何もないので、決して起こらないでしょう。それがAVMの限界です。

Here's an extended example.

+0

私は元々それを持っていましたが私はいつも持っています: 1067:型の値の暗黙の強制。flash.display:DisplayObjectから関連のない型flash.display:BitmapData。 上記の方法をこの記事で見ました:http://stackoverflow.com/questions/644156/as3best-practice-for-getting-image-from-loader これは問題ではありません。私の問題は、ロードメソッドでwhileループを壊すことができないように見えることです。 –

+0

私の問題は、ロードメソッドのwhileループから脱出できないようだということでした。私はより一般的でなければならない。私の問題は、ロードされた後、ビットマップを安全に返すことです。あなたが投稿した例はこれを実証していません。 –

+0

これはループが壊れることはありません。あなたはループでそれを壊す必要があります。あなたは効果的にその行にあなたのアプリを有料化しています。それはまた、あなたが新しいものを使用するときに暗黙の強制的な警告を与えるだけです。 loader.contentはビットマップです。あなたはbitmap = loaderと言うことができます。あなたが望むなら、ビットマップとしてのコンテンツ。 –

0

あなたは、このコードを持つことはできません。

public function load():Bitmap 
{ 
    loader.load(new URLRequest(filePath)); 

    // this line can *never* work 
    while(!hasLoaded); 

    return bitmap; 
} 

あなたロードコマンドからビットマップを返すことはできません。非同期になるようにコードをロードして書き込む要求の後に、関数を終了する必要があります。

基本的に、何を書くために必要なのです。

  1. 要求負荷
  2. completeListenerコールバック
  3. 使用ビットマップ

ため

  • 待ちだから、これは次のようになります。

    public function load():void 
    { 
        loader.load(new URLRequest(filePath)); 
    
        // remember you cannot return a Bitmap now. 
        // It hasn't loaded yet. You can't wait in here 
        // so just return. 
    } 
    
    private function completeListener(event:Event):void 
    { 
        bitmap = new Bitmap(Bitmap(LoaderInfo(event.target).content).bitmapData); 
    
        // HERE the bitmap is *now* available 
        // you now need to tell your app that it is available so it can use it. 
    } 
    
  • 関連する問題