2012-03-11 27 views
0

我有以下兩類:我自定義的AS3圖像加載的類加載圖像兩次......不是預期的行爲

每一個鏈接到庫中的元件。 dynamic_single_image和dynamic_image,分別。

我將dynamic_image的一個實例拖動到我的時間軸上...並基於movieclip實例的名稱...我使用代碼inloadMyImage加載圖像文件名及其關聯的備用圖像。

理想情況是DynamicImage的loadMyImage被調用(加載alt圖像)...它反過來調用super.loadMyImage(加載英文圖像)。應該加載兩個圖像文件。

然而,這對圖像是LOADED TWICE ...請參閱下面的跟蹤語句。

我覺得即使我的movieclip實例是DynamicImage ...超級的構造函數先被調用,然後調用DyanmicImage的構造函數!

public class DynamicSingleImage extends Sprite 
{ 
    var eLoader:Loader; //for english image 

    public function DynamicSingleImage() 
    { 
     trace("DynamicSingleImage...for: " + this.name); 
     loadMyImage();   
    } 

    public function loadMyImage() :void 
    { 
     ... 

     trace("always load ENGLISH file :" + engFilename); 

     ... 
    } 
    } 




public class DynamicImage extends DynamicSingleImage 
{ 
    var aLoader:Loader; //for alternate language image 

    public function DynamicImage() 
    { 
     trace("DynamicImage for: " + this.name); 
     this.loadMyImage(); 

    } 

    override public function loadMyImage() :void 
    { 
     trace("============= START ========================"); 
     trace("loading images for mc: " + this.name); 

        ... 

     super.loadMyImage(); //first call the super to load the English version 
       trace("load image for alternate language..." + altFilename 

        ... 

     trace("============= END ========================"); 
      } 

這是跟蹤輸出:

DynamicSingleImage...for: eel_hotspot_content_mc 
============= START ======================== 
loading images for mc: eel_hotspot_content_mc 
always load ENGLISH file :eel_hotspot_content.jpg 
load image for alternate language...eel_hotspot_content_alt.jpg 
============= END ======================== 
DynamicImage for: eel_hotspot_content_mc 
============= START ======================== 
loading images for mc: eel_hotspot_content_mc 
always load ENGLISH file :eel_hotspot_content.jpg 
load image for alternate language...eel_hotspot_content_alt.jpg 

回答

1

超級構造的確是第一次調用的時候給它一個特定的呼叫中不存在擴展構造。我認爲最簡單的解決方案是強制構造函數被稱爲第二個,並且有一個標誌被檢查以查看圖像是否已經被加載一次。見下:

public class DynamicSingleImage extends Sprite 
{ 
    var eLoader:Loader; //for english image 
    var loaded:Boolean; 

    public function DynamicSingleImage() 
    { 
     trace("DynamicSingleImage...for: " + this.name); 

     if (!loaded) 
      loadMyImage();   
    } 

    public function loadMyImage() :void 
    { 
     ... 

     trace("always load ENGLISH file :" + engFilename); 

     loaded = true; 

     ... 
    } 
    } 




public class DynamicImage extends DynamicSingleImage 
{ 
    var aLoader:Loader; //for alternate language image 

    public function DynamicImage() 
    { 
     trace("DynamicImage for: " + this.name); 
     this.loadMyImage(); 

     super(); 

    } 

    override public function loadMyImage() :void 
    { 
     trace("============= START ========================"); 
     trace("loading images for mc: " + this.name); 

        ... 

     super.loadMyImage(); //first call the super to load the English version 
       trace("load image for alternate language..." + altFilename 

        ... 

     trace("============= END ========================"); 
      } 
+0

對於super construtor總是從子類構造函數中調用的信息+1。 – milesmeow 2012-03-12 21:36:57

0

想通了。 由於超級構造函數是自動調用的,我從我的子類的構造函數中取出了loadMyImage。

就是這樣。現在,這是什麼情況?

  1. 我的影片剪輯的實例在舞臺上實例動態圖片
  2. 動態圖片的構造函數自動調用超級構造
  3. 超級構造函數調用重寫loadMyImage在我的子類!
  4. 我的子類的loadMyImage調用super.loadMyImage

現在一切都很好。從'super.loadMyImage'加載'english'圖像...'alt'圖像加載到子類的loadMyImage中。